philposer
Messages postés18Date d'inscriptionsamedi 12 février 2005StatutMembreDernière intervention10 octobre 2012
-
17 janv. 2012 à 22:36
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 2013
-
18 janv. 2012 à 20:26
Bonjour (bonsoir) à tous,
je viens de tomber sur quelque chose d'un peu particulier en analysant le framework fuel-php et malgré la doc PHP je ne comprend pas. Du coup j'ai besoin de vos explication afin de m'éclairer.
la partie de code de la class est le suivant:
public static function forge(array $config = array())
{
return new static($config);
}
en fait la ligne que je ne comprend pas est le return new static?? comment peut-on faire un new d'un static qui n'est pas une class mais bien un mot protegé?
TychoBrahe
Messages postés1309Date d'inscriptionsamedi 31 janvier 2009StatutMembreDernière intervention 5 juin 201312 18 janv. 2012 à 20:26
Salut,
En gros après quelques recherche ca revient à faire return new my_class()
C'est effectivement le cas, dans ce cadre là self permet de référer à la classe courrante (cf Late Static Bindings).
Donc pourquoi créer la class par "l'interieur" en faisant comme ca:
[...]
que plutôt utiliser un constructeur public et créer la class par "l'exterieur"
Comme ça je vois deux raisons. La première, qui se rencontre souvent mais n'est pas applicable dans le cas présent, est de faire un singleton. La seconde est de contourner certaines limitations de php 5.3 (la version 5.4 de php corrigera ce problème). Un exemple de limitation et l'utilisation de cette construction "externe" pour contourner :
<?php
class Toto
{
public static function forge()
{
return new static();
}
public function foo()
{
return 42;
}
public function __toString()
{
return 'bar';
}
}
//$val = new Toto()->foo();
$val = Toto::forge()->foo();
//echo 'Test: ' . new Toto() . PHP_EOL;
echo 'Test: ' . Toto::forge() . PHP_EOL;
?>
En commentaire ce que l'on souhaitais faire et qui ne fonctionne pas dans les versions antérieurs à 5.4 de php. Juste en dessous la manière de contourner.
philposer
Messages postés18Date d'inscriptionsamedi 12 février 2005StatutMembreDernière intervention10 octobre 2012 18 janv. 2012 à 13:04
En gros après quelques recherche ca revient à faire
return new my_class()
Donc pourquoi créer la class par "l'interieur" en faisant comme ca:
<?php
class a
{
public $this->var = '';
protected function __construct($params)
{
$this->var = $params;
}
public static function create($params)
{
return new static($params);
}
$test = a::create('params');
?>
que plutôt utiliser un constructeur public et créer la class par "l'exterieur":
<?
$test = new a('params');
?>
je n'arrive pas à voir de différence et/ou avantage?? :-(