55 votes

Comment chaîner une méthode sur un objet nouvellement créé?

J'aimerais savoir s'il existe un moyen de chaîner des méthodes sur un objet nouvellement créé en PHP?

Quelque chose comme:

 class Foo {
    public function xyz() { ... return $this; }
}

$my_foo = new Foo()->xyz();
 

Quelqu'un sait-il comment y parvenir?

99voto

Alan Storm Points 82442

En PHP 5.4+, l'analyseur a été modifié de sorte que vous pouvez faire quelque chose comme ceci

(new Foo())->xyz();

Enveloppez-la d'instanciation entre parenthèses, et la chaîne de loin.

Avant PHP 5.4, lorsque vous utilisez l'

new Classname();

la syntaxe, vous ne pouvez pas la chaîne d'un appel de méthode hors de l'instanciation. C'est une limitation de PHP 5.3 de la syntaxe. Une fois qu'un objet est instancié, vous pouvez la chaîne de loin.

Une méthode que j'ai vu utilisé pour contourner ce est une instanciation statique méthode de quelque sorte.

class Foo
{
    public function xyz()
    {
        echo "Called","\n";
        return $this;
    }

    static public function instantiate()
    {
        return new self();
    }
}


$a = Foo::instantiate()->xyz();

En enveloppant l'appel à nouveau dans une méthode statique, vous pouvez instancier une classe avec un appel de méthode, et vous êtes ensuite libre de la chaîne de ça.

23voto

Kenaniah Points 4129

Définissez une fonction globale comme ceci:

 function with($object){ return $object; }
 

Vous pourrez alors appeler:

 with(new Foo)->xyz();
 

11voto

Jackson Points 161

En PHP 5.4, vous pouvez chaîner un objet nouvellement instancié:

http://docs.php.net/manual/fr/migration54.new-features.php

Pour les anciennes versions de PHP, vous pouvez utiliser la solution d'Alan Storm.

6voto

Ingwie Phoenix Points 46

Cette réponse est obsolète - voulez donc la corriger.

En PHP 5.4.x, vous pouvez chaîner une méthode à un nouvel appel. Prenons cette classe comme exemple:

 <?php class a {
    public function __construct() { echo "Constructed\n"; }
    public function foo() { echo "Foobar'd!\n"; }
}
 

Maintenant, nous pouvons utiliser ceci: $b = (new a())->foo();

Et le résultat est:

 Constructed
Foobar'd!
 

Des informations complémentaires sont disponibles sur le manuel: http://www.php.net/manual/en/migration54.new-features.php

3voto

Lukey Points 328

Eh bien, ce peut être une vieille question, mais comme beaucoup de choses dans la programmation, - éventuellement, la réponse change.

Quant à PHP 5.3, non, vous ne pouvez pas la chaîne directement à partir du constructeur. Pour se développer sur les accepté de répondre toutefois, afin de tenir compte de l'héritage, vous pouvez le faire:

abstract class Foo 
{    
    public static function create() 
    {
        return new static;
    }
}

class Bar extends Foo
{
    public function chain1()
    {
        return $this;
    }

    public function chain2()
    {
        return $this;
    }
}

$bar = Bar::create()->chain1()->chain2();

Qui fonctionnent très bien, et vous retourner une nouvelle Barre() de l'instance.

En PHP 5.4, cependant, vous pouvez tout simplement faire:

$bar = (new Bar)->chain1()->chain2();

Espérons que cela aide quelqu'un de tomber sur la question, comme je l'ai!

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X