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.Respostas:
Você sempre deve declarar suas propriedades de classe antes do tempo. Embora o PHP seja uma linguagem dinâmica e, com toda a certeza, funcione ao criar suas propriedades em tempo de execução, existem várias desvantagens nesse caminho.
O problema que você descreveu é realmente menor quando comparado ao problema de não declarar suas propriedades em sua definição de classe. Aqui está uma boa solução.
Acostume-se a declarar padrões para suas propriedades.
Exceto pelas propriedades que armazenarão objetos, isso cobrirá a maioria dos tipos de base que você armazenará. As propriedades que armazenarão objetos podem ser definidas no seu construtor.
Uma boa regra para o design de classe é que, após seu objeto ter sido criado e seu construtor executado, você não deverá ter nenhuma propriedade "indefinida".
fonte
Eu trabalhei em algum código que usava propriedades de objetos criadas dinamicamente. Eu pensei que usar propriedades de objetos criadas dinamicamente era bem legal (é verdade, na minha opinião). No entanto, meu programa levou 7 segundos para ser executado. Eu removi as propriedades dinâmicas do objeto e as substitui, declaradas como parte de cada classe (pública neste caso). O tempo de CPU passou de 7 segundos para 0,177 segundos. Isso é bastante substancial.
É possível que eu estivesse fazendo algo errado na maneira como estava usando propriedades dinâmicas de objetos. Também é possível que minha configuração esteja quebrada de alguma forma. Obviamente, devo dizer que tenho uma configuração simples de baunilha em PHP na minha máquina.
fonte