Les meilleures pratiques pour les constructeurs statiques
Je veux créer une instance d'une classe et d'appeler une méthode sur cette instance, dans une seule ligne de code.
PHP ne permettent pas à l'appel d'une méthode sur un régulier constructeur:
new Foo()->set_sth(); //Outputs an error.
Donc je suis en utilisant, si je peux appeler ça comme ça, un constructeur statique:
Foo::construct()->set_sth();
Voici ma question:
Est à l'aide de constructeurs statiques comme ça considéré comme une bonne pratique, et si oui, comment vous recommandons de nommer les méthodes de ces constructeurs statiques?
J'ai été hésitant sur l'une des options suivantes:
Foo::construct();
Foo::create();
Foo::factory()
Foo::Foo();
constructor::Foo();
- Mais ce qui est le point de créer une instance, si vous n'avez pas stocker l'instance. Vous pouvez simplement appeler directement une fonction statique puis ne pouvez-vous pas? Ou sinon, peut-être un Singleton pourrait vous intéresser?
- Je ne dis pas que je ne suis pas stocker l'instance.
- Si vous dans la théorie voulez faire
new Foo()->bar();
vous n'êtes pas le stockage de l'instance. C'est pourquoi je suppose que c'. Pourtant, je pense que le Pattern Singleton est à droite de votre allée. - Voici un monde réel de la ligne de code:
echo ORM::factory('article')->find(1)->title;
- ce n'est pas le stockage d'une instance, il n'est pas un Singleton, et il a encore un sens. N'aimeriez-vous pas d'accord?
Vous devez vous connecter pour publier un commentaire.
La désignation de toute méthode doit être avec intention de révéler les noms de. Je ne peux pas dire ce 'Foo::factory" ne. Essayez de construire un langage de plus haut niveau:
Ce serait la même chose que:
Vous pouvez également facilement tester si l'Utilisateur::with100StartingPoints() est égal à ce.
Constructeurs statiques (ou "nommé constructeurs") sont seulement bénéfique pour prouver une intention, comme @koen dit.
Depuis 5.4 si, un truc appelé "déréférencement" est apparue, ce qui vous permet de inline de l'instanciation de classe directement par un appel de méthode.
Donc, constructeurs statiques ne sont utiles que si vous disposez de plusieurs moyens pour instancier des objets.
Si vous avez un seul (toujours le même type d'arguments et le nombre d'arguments), il n'est pas nécessaire pour les constructeurs statiques.
Mais si vous avez plusieurs façons d'instanciations, puis constructeurs statiques sont très utile, car elle permet d'éviter de polluer votre principal constructeur avec argument inutile de vérifier, l'affaiblissement des langues contraintes.
Exemple:
Comme vous pouvez le voir dans
oneDayStartingToday
, la méthode statique peut accéder aux champs privés de l'instance! Un fou n'est-ce pas ? 🙂Pour une meilleure explication, voir http://verraes.net/2014/06/named-constructors-in-php/
Si vous n'avez pas besoin d'une référence pour le nouvellement construit
Foo
, pourquoi ne pas tout simplement faireset_sth
unstatic
fonction (et de créer une nouvelleFoo
en interne si nécessaire)?Si vous ne besoin pour obtenir la main de la référence, comment le feriez-vous?
return $this
dansset_sth
? Mais alorsset_sth
peuvent être fabriqués dans une usine de la fonction, de toute façon.La situation que je peux penser est que si vous voulez l'appeler chaînage de méthodes (comme dans une interface fluide) sur un nouvellement construit instance, tous dans la même expression. Est-ce que vous essayez de faire?
De toute façon, vous pouvez utiliser une fonction de fabrication pour tous les types d'objets, par exemple
set_sth
il serait de travailler par la suite.C'est probablement pas tout à fait un meilleures pratiques, mais vous pouvez utiliser le fait que les fonctions et les classes ont deux différents espaces de noms : vous pouvez avoir une fonction qui ont le même nom qu'une classe.
Ce qui permet d'écrire ce genre de code, par exemple :
Remarque que j'ai défini une fonction appelée
MyClass
, et une classe du même nom.Ensuite, vous pouvez écrire ceci :
Qui fonctionne parfaitement, et de ne pas vous toute erreur -- ici, vous obtenez le résultat suivant :
Plus Jon répondre: permettre À des arguments du constructeur utilisation suivantes:
Documentation:
ReflectionClass
->
newInstanceArgs
Ceux-ci sont appelés des méthodes de création de, et j'ai généralement le nom de leur
createXXX()
commecreateById()
oucreateEmptyCatalog()
. Non seulement ils fournissent un bon moyen de révéler les différentes intentions d'un objet constructeurs, mais ils permettent immédiate de la méthode de chaînage dans une interface fluide.Propulser utilise une méthode statique "créer". J'irais avec ça. Cette méthode rend le code plus facile à tester plutôt que de simplement en utilisant des méthodes statiques pour effectuer une logique d'entreprise.
En outre, vous pouvez également passer des paramètres au constructeur. Par exemple:
Dans les deux cas, vous seriez en mesure d'invoquer myMethod juste après la méthode de création de la
Un peu en retard à la fête, mais je pense que cela pourrait aider.
cela peut ensuite être utilisé comme
paramètres optionnels peuvent être transmises soit par l' __constructeur ou myMethod.
Ceci est mon premier post et j'espère que j'ai obtenu les gimmicks droit