Aujourd'hui, la réponse acceptée est obsolète.
Renommer les classes est une mauvaise pratique : vous devez vous rappeler où et comment renommer les classes à chaque fois que vous passez à une nouvelle version. Parfois (comme l'utilisation de Réflexion ou une structure de dépendance complexe), cela peut être impossible sans un remaniement radical. Et ceci est complexité accidentelle que vous voulez éviter. C'est pourquoi espaces de noms ont été introduits dans le PHP. Java, C++ ou C# n'utilisent pas le langage __construct
ils utilisent un constructeur nommé et il n'y a pas de problème avec eux.
Depuis PHP 5.3.3, les méthodes portant le même nom que le dernier élément d'un fichier espace nom ne sera plus traité comme un constructeur. Ce changement n'affecte pas les classes non espacées par un nom. .
Exemple
namespace Foo;
class Test {
var $a = 3;
function Test($a) {
$this->a = $a;
}
function getA() {
return $this->a;
}
}
$test = new Test(4);
echo $test->getA(); // 3, Test is not a constructor, just ordinary function
Notez que les constructeurs nommés ne sont pas dépréciés (PHP 5.5 aujourd'hui). Cependant, vous ne pouvez pas prévoir que votre classe ne sera pas utilisée dans un espace de nom, donc __construct
devraient être privilégiés.
Clarification sur les mauvaises pratiques mentionnées ci-dessus (pour Dennis)
Quelque part dans votre code, vous pourriez utiliser ReflectionClass::getName() ; lorsque vous renommez la classe, vous devez vous souvenir de l'endroit où vous avez utilisé Reflection et vérifier si l'attribut getName()
Le résultat est toujours cohérent dans votre application. Plus vous devez vous souvenir de quelque chose de précis, plus vous risquez d'oublier quelque chose, ce qui entraîne des bogues dans l'application.
Les parents ne peuvent pas avoir le contrôle sur toutes les classes du monde qui dépendent d'eux. Si allow_url_include est activé, d'autres sites web pourraient utiliser la classe de votre serveur, ce qui pourrait provoquer un crash si vous renommez une classe. C'est encore pire dans les langages compilés mentionnés ci-dessus : la bibliothèque peut être copiée et intégrée dans un autre code.
Il n'y a aucune raison de renommer la classe :
- si le nom de la classe est en conflit, utiliser les espaces de noms
- si la responsabilité de la classe se déplace, dérivez une autre classe à la place
Dans les classes PHP en espace de nom, la méthode avec le même nom devrait être évitée de toute façon : intuitivement elle devrait produire un objet créé la classe ; si elle fait autre chose, pourquoi lui donner le même nom ? Ce devrait être un constructeur et rien d'autre. Le problème principal est que le comportement d'une telle méthode dépend de l'utilisation de l'espace de noms.
Il n'y a pas de problème avec les constructeurs __construct en PHP. Mais ce n'était pas l'idée la plus intelligente de modifier les constructeurs nommés.