__construct() vs SameAsClassName() pour le constructeur en PHP
Est-il un avantage à l'aide de __construct()
au lieu du nom de la classe pour un constructeur en PHP?
Exemple (__construct
):
class Foo {
function __construct(){
//do stuff
}
}
Exemple (nommé):
class Foo {
function Foo(){
//do stuff
}
}
Avoir le __construct
méthode (premier exemple) est possible depuis PHP 5.
De disposer d'une méthode avec le même nom que la classe en tant que constructeur (deuxième exemple) est possible à partir de la version de PHP 4 jusqu'à la version 7.
Vous devez vous connecter pour publier un commentaire.
Je suis d'accord avec gizmo, l'avantage est donc que vous n'avez pas à le renommer si vous renommez votre classe. SEC.
De même, si vous avez un enfant de la classe, vous pouvez appeler
à appeler le constructeur parent. Si d'autres en bas de la piste que vous modifiez la classe la classe enfant hérite de partir, vous n'avez pas à modifier la construction de l'appeler pour le parent.
Il semble comme une petite chose, mais l'absence de modification de l'appel du constructeur nom de vos parents des classes pourrait créer de subtiles (et pas si subtile) les bugs.
Par exemple, si vous avez inséré une classe dans votre heirachy, mais il a oublié de changer le constructeur appels, vous pouvez appeler les constructeurs de grands-parents à la place des parents. Cela peut souvent entraîner des résultats indésirables qui pourraient être difficiles à remarquer.
Également noter que
Source: http://php.net/manual/en/language.oop5.decon.php
__construct
a été introduit en PHP5. C'est la façon dont vous êtes censé le faire maintenant. Je ne suis pas au courant de tout avantages en soi, mais les.Du manuel PHP:
Si vous êtes sur PHP5, je vous conseille d'utiliser
__construct
pour éviter de faire de PHP chercher ailleurs.Le principal avantage que je vois pour __construct, c'est que vous n'avez pas à renommer votre constructeur si vous modifiez votre nom de classe.
Aujourd'hui, l'on a accepté la réponse est obsolète.
Renommer les classes est une mauvaise pratique: vous devez vous rappeler où et quoi de renommer chaque fois que vous mettez à niveau vers une nouvelle version. Parfois (comme l'utilisation de La réflexion ou complexes de la structure de dépendance), il peut être impossible en l'absence radicale de refactoring. Et c'est accidentelle de la complexité que vous voulez éviter. C'est pourquoi espaces de noms a été introduit en PHP. Java, C++ ou C# ne pas utiliser
__construct
, ils utilisent nommé constructeur et il n'y a pas de problème avec eux.Exemple
Noter que nommé les constructeurs ne sont pas dépréciées (PHP 5.5 aujourd'hui). Cependant, vous ne pouvez pas prédire que votre classe ne sera pas utilisé dans l'espace de noms, donc
__construct
devraient être privilégiés.Des précisions sur les mauvaises pratiques mentionnées ci-dessus (pour Dennis)
Quelque part dans votre code, vous pouvez utiliser ReflectionClass::getName(); lorsque vous renommez la classe, vous devez vous rappeler où vous avez utilisé la Réflexion et de vérifier si le
getName()
résultat est toujours cohérent dans votre application. Le plus vous avez besoin de se rappeler quelque chose de spécifique, plus il est probable que quelque chose est oublié qui entraîne des bugs dans l'application.Les parents ne peuvent pas avoir le contrôle sur toutes les classes dans le monde qui dépend d'eux. Si allow_url_include est activée, certaines autres web pourrait être l'utilisation de la classe à partir de votre serveur, qui peut se bloquer si vous renommez un peu de classe. C'est encore pire dans les langages compilés mentionnés ci-dessus: la bibliothèque peut être copié et regroupés dans un autre code.
Il n'y a pas de raison pour renommer la classe:
En PHP classes dans l'espace de noms, la méthode avec le même nom devrait être évitée dans tous les cas: intuitivement, il doit produire un objet créé la classe; si c'est autre chose, pourquoi lui donner le même nom? Il devrait être un constructeur et rien d'autre. Le principal problème est que le comportement d'une telle méthode repose sur l'utilisation de l'espace de noms.
Il n'y a pas de problème de __construct constructeurs en PHP. Mais ce n'était pas la meilleure idée de modifier le nom des constructeurs.
Le meilleur avantage de l'utilisation
__contruct()
au lieu deClassName()
est lors de l'extension des classes. Il est beaucoup plus facile d'appelerparent::__construct()
au lieu deparent::ClassName()
, comme il est réutilisable parmi les classes et les parents peuvent être modifiés facilement.Dans votre exemple
Foo::Foo
est parfois appelé PHP 4 ou de style ancien constructeur, car il vient de l'époque de PHP 4:PHP 4 constructeurs sera obsolète mais pas supprimé en PHP 7. Ils ne seront plus considérés comme des constructeurs dans n'importe quelle situation en PHP 8. La compatibilité Future est certainement une bonne raison de ne pas utiliser cette fonctionnalité.
En PHP 5, l'avantage serait que le rendement serait meilleur. Il va chercher un constructeur par le nom de
__construct
d'abord, et si il ne le trouve pas, il va chercher les constructeurs par le nom declassName
. Donc, si il trouve un constructeur par le nom__construct
il n'est pas nécessaire à la recherche d'un constructeur par le nomclassName
.Eh bien, il a été quelques années depuis que cette question a été posée, mais je pense que je dois répondre à ça encore, parce que les choses ont changé et pour les lecteurs, dans l'avenir, je veux garder l'information à jour!
Donc en php-7 ils vont supprimer la possibilité de créer le constructeur comme une fonction avec le même nom que la classe. Si vous le faites, vous obtiendrez un
E_DEPRECATED
.Vous pouvez lire plus au sujet de cette proposition est acceptée) ici:
https://wiki.php.net/rfc/remove_php4_constructors
Et un devis à partir de là:
Aussi, vous ne sera pas obtenir un
E_STRICT
en php-7 si vous définissez une méthode avec le même nom que la classe ET un__construct()
.Vous pouvez le voir aussi ici:
Donc, je vous recommande d'utiliser
__construct()
, puisque vous aurez moins de problèmes avec cela à l'avenir.La compatibilité ascendante. Il y a toujours une chance que le code hérité que de la gauche dans la langue vers l'arrière la compatibilité du souci sera supprimée dans une future version.
Si il y a des méthodes de __construct et SameAsClassName méthode __construct sera exécutée, SameAsClassName méthode sera ignoré.
Je pense que la raison principale est que c'est la langue de la convention.
Vous n'avez pas besoin de la force d'une langue à agir comme quelqu'un d'autre.
Je veux dire, en Objective-C, vous préfixe le constructeur avec initialisation, par exemple. Vous pouvez faire votre propre constructeur à l'aide de votre nom de classe, mais pourquoi? Sont ther une raison pour utiliser ce schéma au lieu de la langue de la convention?