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
Était-ce utile?

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top