J'ai la recherche sur le chaînage de la méthode PHP et tous les tutoriels disponibles sur le web utilisent le "return $ this" pour le chaînage des méthodes. Y at-il une méthode magique ou une bibliothèque qui peut être utilisée pour aider à enchaîner une méthode de classe sans écrire "return $ this" à la fin de chaque méthode.PHP Méthode Chaînage sans écrire beaucoup de retour ceci
Répondre
Dans le langage lui-même il n'y a pas moyen d'y parvenir sans return $this
. Les fonctions et méthodes qui ne spécifient pas de valeur de retour renverront null
en PHP comme indiqué dans la documentation ici: http://php.net/manual/en/functions.returning-values.php.
Comme null
n'est pas un objet avec des méthodes appelables, une erreur sera levée lorsque l'élément suivant de la chaîne est appelé.
Votre EDI peut avoir certaines fonctionnalités qui facilitent la tâche répétitive, comme l'utilisation d'extraits ou la recherche et le remplacement d'une regex. Mais en dehors de cela, la langue elle-même exige actuellement que vous conceviez votre classe pour être utilisée couramment avec le chaînage, ou spécifiquement le concevoir pour ne pas l'être.
EDIT 1
Je suppose que vous pourriez imaginer utiliser des méthodes magiques pour obtenir quelque chose comme ça "auto-magie". Je déconseillerais car c'est un mauvais paradigme, mais cela ne signifie pas que vous ne pouvez pas le faire fonctionner.
Ma pensée est que vous pourriez nous la méthode magique __call
pour envelopper vos méthodes réelles (http://php.net/manual/en/language.oop5.overloading.php#object.call).
<?php
class Whatever
{
public function __call($method, $parameters)
{
//If you're using PHP 5.6+ (http://php.net/manual/en/functions.arguments.php#functions.variable-arg-list)
$this->$method(...$parameters);
//If using < PHP 5.6
call_user_func_array(array($this, $method), $parameters);
//Always return self
return $this;
}
//Mark methods you want to force chaining on to protected or private to make them inaccessible outside the class, thus forcing the call to go through the __call method
protected function doFunc($first, $second)
{
$this->first = $first;
$this->second = $second;
}
}
Je ne pense donc que c'est une possibilité, mais encore une fois je ne pense personnellement qu'une solution magique, bien que valide, dégage une odeur de code important et qui pourrait le rendre plus juste face à taper return $this
où vous intention, par votre conception, pour permettre l'enchaînement.
Si vous visez la compatibilité au-dessous de 5.6, je reconnais juste utiliser' array() 'sur' [] '. – Xorifelse
Bon point - les crochets auraient un effet fatal sur tout ce qui est inférieur à 5.4. Je vais changer cela pour rendre le commentaire précis. – stratedge
Je pense qu'un extrait est meilleur. Je veux éviter un problème futur lors du test unitaire, etc – nonsensecreativity
Utilisez un outil tel que phpstrom et créez un modèle en direct pour les méthodes courantes où la partie return $this;
est déjà écrite. Ensuite, utilisez ce modèle via un raccourci, par exemple. courant. Ainsi, vous n'écrirez plus jamais un en-tête de méthode, un corps et une valeur de retour pour une méthode courante.
http://jetbrains.com/help/phpstorm/live-templates.html
Avoir une belle journée
Malheureusement j'utilise Sublime Text – nonsensecreativity
Non, il n'y en a pas; sauf si vous utilisez l'invocation magique ce qui n'est pas une bonne idée ... quel est votre problème avec un retour à la fin de chaque méthode? –
Peut-être une nouvelle fonctionnalité de PHP 7.2 (https://wiki.php.net/rfc/pipe-operator) – Xorifelse
@MarkBaker c'est que j'ai écrit trop de retour $ this sur mes bibliothèques – nonsensecreativity