Considere el siguiente código, en el que el setter se rompe deliberadamente debido a un error de programación mundano que he cometido algunas veces en el pasado:
<?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();
?>
El hecho de que declare $testFielden la parte superior de la clase me ayuda a ocultar ese error de programación. Si no hubiera declarado el campo, obtendría algo similar a la siguiente advertencia impresa en mi registro de errores al llamar a este script, lo que podría ser valioso para ayudar a mi depuración, especialmente si cometiera un error como este en Una aplicación grande y complicada del mundo real:
Aviso PHP: Propiedad indefinida: TestClass :: $ testField en /var/www/test.php en la línea 13
Con la declaración, no hay advertencia.
Tal vez me falta algo, pero solo conozco dos razones para declarar campos de clase en PHP: en primer lugar, que las declaraciones actúan como documentación y, en segundo lugar, que sin declaraciones no se pueden usar los modificadores privatey de protectedacceso, que son posiblemente útil. Como el último argumento no se aplica a los campos públicos, la asignación a un campo no declarado de un objeto lo hace público, me parece que al menos debería comentar todas mis declaraciones de campo público. Los comentarios proporcionarán exactamente el mismo valor de documentación, pero me beneficiaré de las advertencias si intento leer un campo no inicializado.
Pensándolo mejor, sin embargo, no parece tener sentido detenerse allí. Dado que, en mi experiencia, intentar leer un campo no inicializado es una causa de error mucho más común que tratar de leer o modificar de manera inapropiada un campo privado o protegido (ya he hecho lo anterior varias veces en mi corta carrera de programación, pero nunca lo último) ), me parece que comentar todas las declaraciones de campo, no solo las públicas, sería la mejor práctica.
Lo que me hace dudar es que nunca he visto a nadie más hacerlo en su código. Por qué no? ¿Hay algún beneficio en declarar campos de clase que desconozco? ¿O puedo modificar la configuración de PHP de alguna manera para cambiar el comportamiento de las declaraciones de campo de modo que pueda usar declaraciones de campo reales y aún así beneficiarme de las advertencias de "Propiedad indefinida"? ¿O hay algo más que me haya perdido en mi análisis?
TRUE === $variablepara evitar asignar accidentalmente en lugar de comparar.