Considérez le code suivant, dans lequel le setter est délibérément cassé en raison d'une erreur de programmation banale que j'ai commise à plusieurs reprises dans le passé:
<?php
class TestClass {
private $testField;
function setField($newVal) {
$testField = $newVal;
// deliberately broken; should be `$this->testField = $newVal`
}
function getField() {
return $this->testField;
}
}
$testInstance = new TestClass();
$testInstance->setField("Hello world!");
// Actually prints nothing; getField() returns null
echo $testInstance->getField();
?>
Le fait que j'ai déclaré $testField
en haut de la classe aide à me cacher cette erreur de programmation. Si je n'avais pas déclaré le champ, j'obtiendrais quelque chose de similaire à l'avertissement suivant imprimé dans mon journal d'erreurs lors de l'appel de ce script, ce qui pourrait être utile pour aider mon débogage - surtout si je faisais une erreur comme celle-ci dans une application réelle et complexe:
Remarque PHP: Propriété non définie: TestClass :: $ testField dans /var/www/test.php sur la ligne 13
Avec la déclaration, il n'y a pas d'avertissement.
Peut-être que je manque quelque chose, mais je ne connais que deux raisons pour déclarer des champs de classe en PHP: premièrement, que les déclarations agissent comme documentation, et deuxièmement, que sans déclarations, on ne peut pas utiliser les modificateurs private
et protected
access, qui sont sans doute utile. Puisque ce dernier argument ne s'applique pas aux champs publics - l'attribution à un champ non déclaré d'un objet le rend public - il me semble que je devrais au moins commenter toutes mes déclarations de champs publics. Les commentaires fourniront exactement la même valeur de documentation, mais je bénéficierai d'avertissements si j'essaie de lire un champ non initialisé.
Après réflexion, cependant, il ne semble pas logique de s'arrêter là. Étant donné que dans mon expérience, essayer de lire un champ non initialisé est une cause d'erreur beaucoup plus courante que d'essayer de lire ou de modifier de manière inappropriée un champ privé ou protégé (j'ai déjà fait plusieurs fois le premier dans ma courte carrière de programmation, mais jamais le dernier ), il me semble que commenter toutes les déclarations de champ - pas seulement les déclarations publiques - serait la meilleure pratique.
Ce qui me fait hésiter, c'est que je n'ai jamais vu personne d'autre le faire dans leur code. Pourquoi pas? Y a-t-il un avantage à déclarer des champs de classe que je ne connais pas? Ou puis-je modifier la configuration de PHP d'une manière ou d'une autre pour changer le comportement des déclarations de champ afin que je puisse utiliser de vraies déclarations de champ tout en bénéficiant des avertissements "Propriété non définie"? Ou y a-t-il autre chose que j'ai manqué dans mon analyse?
TRUE === $variable
pour vous empêcher d'attribuer accidentellement au lieu de comparer.Réponses:
Vous devez toujours déclarer vos propriétés de classe à l'avance. Bien que PHP soit un langage dynamique et vous accompagnera avec plaisir lors de la création de vos propriétés lors de l'exécution, il existe plusieurs inconvénients à ce chemin.
Le problème que vous avez décrit est en fait mineur par rapport au problème de ne pas déclarer vos propriétés dans la définition de votre classe. Voici une bonne solution.
Habituez-vous à déclarer les valeurs par défaut de vos propriétés.
À l'exception des propriétés qui stockeront des objets, cela couvrira la majorité des types de base que vous stockerez. Les propriétés qui stockeront les objets peuvent être définies dans votre constructeur.
Une bonne règle pour la conception de classes est qu'après la création de votre objet et l'exécution de votre constructeur, vous ne devriez pas avoir de propriétés "indéfinies".
la source
J'ai travaillé sur du code qui utilisait des propriétés d'objet créées dynamiquement. Je pensais que l'utilisation de propriétés d'objets créées dynamiquement était plutôt cool (vrai, à mon avis). Cependant, mon programme a pris 7 secondes pour s'exécuter. J'ai supprimé les propriétés d'objet dynamiques et les ai remplacées par les propriétés d'objet déclarées dans le cadre de chaque classe (publique dans ce cas). Le temps processeur est passé de plus de 7 secondes à 0,177 seconde. C'est assez substantiel.
Il est possible que je fasse quelque chose de mal dans la façon dont j'utilisais les propriétés des objets dynamiques. Il est également possible que ma configuration soit interrompue d'une manière ou d'une autre. Bien sûr, je dois dire que j'ai une configuration PHP vanille très simple sur ma machine.
la source