Considere o código a seguir, no qual o setter é deliberadamente quebrado devido a um erro de programação mundano que cometi de verdade algumas vezes no passado:
<?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();
?>
O fato de eu ter declarado $testField
no topo da classe ajuda a esconder esse erro de programação. Se eu não tivesse declarado o campo, obteria algo semelhante ao seguinte aviso impresso no meu log de erros ao chamar este script, o que seria potencialmente valioso para ajudar na minha depuração - especialmente se eu cometesse um erro como esse em um aplicativo grande e complicado do mundo real:
Aviso do PHP: Propriedade indefinida: TestClass :: $ testField em /var/www/test.php na linha 13
Com a declaração, não há aviso.
Talvez esteja faltando alguma coisa, mas estou ciente de apenas duas razões para declarar campos de classe no PHP: primeiro, que as declarações atuam como documentação e, segundo, que sem as declarações não se pode usar os modificadores private
e protected
access, que são indiscutivelmente útil. Como o último argumento não se aplica a campos públicos - a atribuição a um campo não declarado de um objeto o torna público - parece-me que eu deveria pelo menos comentar todas as minhas declarações de campo público. Os comentários fornecerão exatamente o mesmo valor de documentação, mas vou me beneficiar de avisos se tentar ler um campo não inicializado.
Pensando melhor, porém, não parece fazer sentido parar por aí. Como, na minha experiência, tentar ler um campo não inicializado é uma causa de erro muito mais comum do que tentar ler ou modificar inadequadamente um campo privado ou protegido (já fiz o primeiro várias vezes na minha curta carreira de programação, mas nunca o último ), parece-me que comentar todas as declarações de campo - e não apenas públicas - seria uma prática recomendada.
O que me faz hesitar é que nunca vi ninguém fazer isso em seu código. Por que não? Existe um benefício em declarar campos de classe que eu não conheço? Ou posso modificar a configuração do PHP de alguma forma para alterar o comportamento das declarações de campo para que eu possa usar declarações de campo reais e ainda me beneficiar dos avisos de "Propriedade indefinida"? Ou há mais alguma coisa que eu tenha perdido na minha análise?
TRUE === $variable
para impedir que você atribua acidentalmente, em vez de comparar.