Rozważ następujący kod, w którym seter jest celowo uszkodzony z powodu przyziemnego błędu programistycznego, który popełniłem naprawdę kilka razy w przeszłości:
<?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();
?>
Fakt, że zadeklarowałem $testField
na szczycie klasy, pomaga mi ukryć ten błąd programowy. Gdybym nie zadeklarował tego pola, dostałbym coś podobnego do następującego ostrzeżenia wydrukowanego w moim dzienniku błędów podczas wywoływania tego skryptu, co potencjalnie byłoby cenne dla mojej pomocy w debugowaniu - szczególnie gdybym popełnił taki błąd w duża i skomplikowana aplikacja w świecie rzeczywistym:
Wskazówka PHP: Niezdefiniowana właściwość: TestClass :: $ testField w /var/www/test.php w linii 13
W deklaracji nie ma ostrzeżenia.
Być może coś mi brakuje, ale zdaję sobie sprawę z tylko dwóch powodów, aby zadeklarować pola klas w PHP: po pierwsze, że deklaracje działają jako dokumentacja, a po drugie, że bez deklaracji nie można używać modyfikatorów private
i protected
dostępu, które są prawdopodobnie użyteczne. Ponieważ ten ostatni argument nie dotyczy pól publicznych - przypisanie do niezadeklarowanego pola obiektu czyni go publicznym - wydaje mi się, że powinienem przynajmniej skomentować wszystkie moje deklaracje pól publicznych. Komentarze podadzą dokładnie tę samą wartość dokumentacji, ale skorzystam z ostrzeżeń, jeśli spróbuję odczytać niezainicjowane pole.
Jednak po dalszych przemyśleniach nie ma sensu się na tym zatrzymywać. Ponieważ z mojego doświadczenia wynika, że próba odczytania niezainicjowanego pola jest o wiele bardziej powszechną przyczyną błędu niż próba niewłaściwego odczytania lub modyfikacji pola prywatnego lub chronionego (to samo zrobiłem kilka razy w mojej krótkiej karierze programistycznej, ale nigdy nie drugie ), wydaje mi się, że najlepszą praktyką byłoby komentowanie wszystkich deklaracji terenowych - nie tylko publicznych.
Waham się, że nigdy nie widziałem, aby ktokolwiek inny robił to w swoim kodzie. Dlaczego nie? Czy deklarowanie pól klasowych jest zaletą, o której nie wiem? Czy też mogę w jakiś sposób zmodyfikować konfigurację PHP, aby zmienić zachowanie deklaracji pól, aby móc używać rzeczywistych deklaracji pól i nadal korzystać z ostrzeżeń „Niezdefiniowana właściwość”? Czy jest coś jeszcze, czego nie zauważyłem w mojej analizie?
TRUE === $variable
aby uniknąć przypadkowego przypisania zamiast porównywania.