Considera il seguente codice, in cui il setter viene deliberatamente interrotto a causa di un banale errore di programmazione che ho fatto per davvero alcune volte in passato:
<?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();
?>
Il fatto che ho dichiarato $testField
nella parte superiore della classe aiuta a nascondere l'errore di programmazione da parte mia. Se non avessi dichiarato il campo, otterrei qualcosa di simile al seguente avviso stampato sul mio log degli errori al momento della chiamata a questo script, che sarebbe potenzialmente utile per aiutare il mio debugging - specialmente se dovessi commettere un errore come questo in una grande e complicata applicazione del mondo reale:
PHP Notice: Undefined property: TestClass::$testField in /var/www/test.php on line 13
Con la dichiarazione, non ci sono avvisi.
Forse mi manca qualcosa, ma sono a conoscenza di due soli motivi per dichiarare i campi di classe in PHP: in primo luogo, che le dichiarazioni fungono da documentazione e, in secondo luogo, che senza dichiarazioni non si possa usare private
e protected
modificatori di accesso, che sono probabilmente utili. Dal momento che quest'ultimo argomento non si applica ai campi pubblici - l'assegnazione a un campo non dichiarato di un oggetto lo rende pubblico - mi sembra che io debba almeno commentare tutte le mie dichiarazioni di campo pubbliche. I commenti forniranno lo stesso identico valore di documentazione, ma trarrò vantaggio dagli avvisi se provo a leggere un campo non inizializzato.
Ad un ulteriore pensiero, tuttavia, non sembra logico fermarsi lì. Poiché nella mia esperienza il tentativo di leggere un campo non inizializzato è una causa di errore molto più comune che cercare di leggere o modificare in modo inappropriato un campo privato o protetto (ho già fatto il primo più volte nella mia breve carriera di programmatore, ma mai quest'ultimo ), mi sembra che commentare tutte le dichiarazioni di campo - non solo quelle pubbliche - sarebbe la migliore pratica.
Ciò che mi fa esitare è che non ho mai visto nessun altro farlo nel loro codice. Perchè no? C'è un vantaggio nel dichiarare campi di classe di cui non sono a conoscenza? Oppure posso modificare la configurazione di PHP in qualche modo per modificare il comportamento delle dichiarazioni di campo in modo che possa utilizzare le dichiarazioni di campo reali e trarre comunque vantaggio dagli avvisi di "Proprietà indefinita"? O c'è qualcos'altro che mi è mancato nella mia analisi?