syntaxe PHP pour appeler des méthodes sur des objets temporaires
Question
Est-il possible d'appeler une méthode sur une déclaration temporaire objet sans être obligé de céder 1er l'objet à une variable?
Voir ci-dessous:
class Test
{
private $i = 7;
public function get() {return $this->i;}
}
$temp = new Test();
echo $temp->get(); //ok
echo new Test()->get(); //invalid syntax
echo {new Test()}->get(); //invalid syntax
echo ${new Test()}->get(); //invalid syntax
La solution
J'utilise la solution suivante quand je veux avoir ce comportement.
Je déclare cette fonction (dans la portée globale):
function take($that) { return $that; }
Je l'utilise de cette façon:
echo take(new Test())->get();
Autres conseils
Qu'est-ce que vous pouvez faire est
class Test
{
private $i = 7;
public function get() {return $this->i;}
public static function getNew() { return new self(); }
}
echo Test::getNew()->get();
Pourquoi ne pas faire ceci:
class Test
{
private static $i = 7;
public static function get() {return self::$i;}
}
$value = Test::get();
Malheureusement, vous ne pouvez pas faire cela. Il est juste la façon dont PHP est, je le crains.
Non. Ceci est une limitation dans l'analyseur de PHP.
J'utilise souvent cette petite fonction pratique
function make($klass) {
$_ = func_get_args();
if(count($_) < 2)
return new $klass;
$c = new ReflectionClass($klass);
return $c->newInstanceArgs(array_slice($_, 1));
}
utilisation
make('SomeCLass')->method();
ou
make('SomeClass', arg1, arg2)->foobar();
Impossible et pourquoi voudriez-vous créer un objet de cette façon du tout?
Le point d'un objet est d'encapsuler état unique. Dans l'exemple que vous avez donné, $i
sera toujours 7, donc il n'y a pas de point dans la création de l'objet, puis obtenir $i
de lui et de perdre l'objet au collecteur d'ordures parce qu'il n'y a pas de référence à l'objet après $i
a été retourné. Une classe statique, comme montré ailleurs, est beaucoup plus logique à cet effet. Ou une fermeture.
Sujet connexe:
Ceci est une vieille question: Je vais juste donner une réponse à jour
.Dans toutes les versions de PHP (depuis 5.4.0, en 2012), vous pouvez faire ceci:
(new Test())->get();
Voir https://secure.php.net/manual/en /migration54.new-features.php ( "l'accès des membres de classe sur instanciation").
est venu récemment sur php-internals, et malheureusement certaines personnes influentes (par exemple des tireurs d'élite) actif dans le développement de PHP opposent à la fonction . Envoyer un email à php-internals@lists.php.net, faites-leur savoir que vous êtes un programmeur adulte.