2017-04-11 5 views
-2

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

+0

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? –

+0

Peut-être une nouvelle fonctionnalité de PHP 7.2 (https://wiki.php.net/rfc/pipe-operator) – Xorifelse

+0

@MarkBaker c'est que j'ai écrit trop de retour $ this sur mes bibliothèques – nonsensecreativity

Répondre

2

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.

+0

Si vous visez la compatibilité au-dessous de 5.6, je reconnais juste utiliser' array() 'sur' [] '. – Xorifelse

+0

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

+0

Je pense qu'un extrait est meilleur. Je veux éviter un problème futur lors du test unitaire, etc – nonsensecreativity

0

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

+0

Malheureusement j'utilise Sublime Text – nonsensecreativity