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.Odpowiedzi:
Zawsze należy wcześniej zadeklarować właściwości klasy. Podczas gdy PHP jest językiem dynamicznym i chętnie będzie towarzyszył Ci podczas tworzenia właściwości w czasie wykonywania, istnieje kilka wad tej ścieżki.
Opisany przez ciebie problem jest w rzeczywistości niewielki w porównaniu z problemem braku deklarowania twoich właściwości w definicji klasy. Oto dobre rozwiązanie.
Przyzwyczaj się do deklarowania wartości domyślnych swoich właściwości.
Z wyjątkiem właściwości, które będą przechowywać obiekty, obejmie to większość typów bazowych, które będziesz przechowywać. Właściwości, które będą przechowywać obiekty, można ustawić w konstruktorze.
Dobrą zasadą przy projektowaniu klas jest to, że po utworzeniu obiektu i uruchomieniu konstruktora nie powinno być żadnych „niezdefiniowanych” właściwości.
źródło
Pracowałem nad kodem, który wykorzystywał dynamicznie tworzone właściwości obiektu. Myślałem, że używanie dynamicznie tworzonych właściwości obiektów jest całkiem fajne (prawda, moim zdaniem). Jednak uruchomienie mojego programu zajęło 7 sekund. Usunąłem właściwości obiektu dynamicznego i zastąpiłem je właściwościami obiektu zadeklarowanymi jako część każdej klasy (w tym przypadku publicznym). Czas pracy procesora wzrósł z ponad 7 sekund do 0,177 sekund. To całkiem spore.
Możliwe, że robiłem coś złego w sposobie używania dynamicznych właściwości obiektu. Możliwe jest również, że moja konfiguracja jest w jakiś sposób zepsuta. Oczywiście powinienem powiedzieć, że mam bardzo prostą waniliową konfigurację PHP na moim komputerze.
źródło