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 $testField
en 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 private
y de protected
acceso, 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 === $variable
para evitar asignar accidentalmente en lugar de comparar.Respuestas:
Siempre debe declarar las propiedades de su clase con anticipación. Si bien PHP es un lenguaje dinámico y estará encantado de crear sus propiedades en tiempo de ejecución, hay varias desventajas en este camino.
El problema que describió es realmente menor en comparación con el problema de no declarar sus propiedades en la definición de su clase. Aquí hay una buena solución.
Acostúmbrese a declarar valores predeterminados para sus propiedades.
Excepto por las propiedades que almacenarán objetos, esto cubrirá la mayoría de los tipos base que almacenará. Las propiedades que almacenarán objetos se pueden establecer en su constructor.
Una buena regla para el diseño de clases es que después de que su objeto haya sido creado y su constructor se haya ejecutado, no debería tener ninguna propiedad "indefinida".
fuente
Trabajé en un código que usaba propiedades de objeto creadas dinámicamente. Pensé que usar propiedades de objeto creadas dinámicamente era bastante bueno (cierto, en mi opinión). Sin embargo, mi programa tardó 7 segundos en ejecutarse. Eliminé las propiedades del objeto dinámico y las reemplacé como propiedades declaradas como parte de cada clase (público en este caso). El tiempo de CPU pasó de más de 7 segundos a 0.177 segundos. Eso es bastante sustancial.
Es posible que estaba haciendo algo mal en la forma en que estaba usando propiedades de objetos dinámicos. También es posible que mi configuración esté rota de alguna manera. Por supuesto, debería decir que tengo una configuración PHP vainilla muy simple en mi máquina.
fuente