Comment la chaîne de méthode sur un objet nouvellement créé?
Je voudrais savoir si il existe un moyen de la chaîne de 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 connais un moyen pour y parvenir?
Vous devez vous connecter pour publier un commentaire.
En PHP 5.4+, l'analyseur a été modifié de sorte que vous pouvez faire quelque chose comme ceci
Envelopper l'instanciation dans la parenthèse, et de la chaîne de loin.
Avant PHP 5.4, lorsque vous êtes à l'aide de 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.
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.
Définir une fonction comme ceci:
Vous serez ensuite en mesure de les appeler:
id()
. Il a beaucoup de l'utilisation de PHP en raison de sa syntaxe et de l'analyseur.@param object $object
+@return object
, mais alors il ne reconnaît pas le bon type de données et l'auto-complétion/suggestions ne fonctionnent pas.En PHP 5.4, vous pouvez la chaîne d'arrêt d'un objet nouvellement instancié:
http://docs.php.net/manual/en/migration54.new-features.php
Pour les anciennes versions de PHP, vous pouvez utiliser Alan Tempête solution.
Cette réponse est obsolète - tiens donc à corriger.
En PHP 5.4.x vous pouvez la chaîne d'une méthode à un nouvel appel. Prenons cette classe comme exemple:
Maintenant, nous pouvons utiliser ceci:
$b = (new a())->foo();
Et la sortie est:
Plus d'informations peuvent être trouvées sur le manuel: http://www.php.net/manual/en/migration54.new-features.php
$b
est ce quefoo()
retourne, pas (nécessairement) de l'objet instancié.foo()
- ce qui est NUL dans ce cas - devenir le contenu de$b
.Bien, cela peut être une vieille question, mais comme beaucoup de choses dans la programmation, - éventuellement, la réponse change.
Concernant 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:
Qui fonctionnent très bien, et vous retourner une nouvelle Barre() de l'instance.
En PHP 5.4, cependant, vous pouvez tout simplement faire:
J'espère que cela aide quelqu'un de tomber sur la question, comme je l'ai!
Il serait vraiment utile si elles "régler ce" dans une version future. J'apprécie vraiment la capacité de la chaîne (en particulier lors du remplissage de collections):
J'ai ajouté une méthode de la classe de base de mon cadre create() qui peut être enchaîné sur des. Devrait fonctionner avec toutes les classes descendantes automatiquement.
Classe::create()->SetName('Kris')->SetAge(36);
Juste pour le plaisir de l'exhaustivité (et pour le plaisir...), puisque personne ne semble avoir évoqué la solution la plus courte (et moins sophistiqué) du code.
Le plus fréquemment utilisé courte durée de vie des objets, en particulier lors de la rédaction des cas de test, où vous n'avez généralement beaucoup de la création d'objet, vous pouvez optimiser pour la saisie de commodité (plutôt que de la pureté), et sorta de " combiner Alan Tempête
Foo::instantiate()
méthode de fabrique et Kenaniah dewith()
global de la fonction technique.Suffit d'en faire la méthode de fabrique, un fonction globale avec le même nom que la classe!. ;-o (Soit l'ajouter comme une commodité wrapper autour de la bonne statique
Foo::instantiate()
ou tout simplement le faire sortir de là, alors que personne ne regarde.)REMARQUE: