Розглянемо наступний код, у якому сеттер навмисно порушується через повсякденну помилку програмування, яку я зробив реально кілька разів у минулому:
<?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();
?>
Те, що я заявив $testFieldу верхній частині класу, допомагає приховати від мене цю помилку програмування. Якби я не оголосив це поле, я отримав би щось подібне до наступного попередження, надрукованого в моєму журналі помилок при виклику цього сценарію, що потенційно може бути корисним для моєї налагодження - особливо, якщо я можу зробити подібну помилку в великий і складний додаток у реальному світі:
Примітка PHP: Не визначена властивість: TestClass :: $ testField у /var/www/test.php у рядку 13
З декларацією попередження немає.
Можливо, мені чогось не вистачає, але мені відомо лише дві причини для оголошення класових полів у PHP: по-перше, що декларації виступають як документація, по-друге, що без декларацій не можна використовувати модифікатори privateта protectedдоступ до них, які є мабуть корисно. Оскільки останній аргумент не стосується публічних полів - присвоєння незадекларованому полю об’єкта робить його загальнодоступним - мені здається, що я повинен хоча б прокоментувати всі мої декларації на публічному полі. У коментарях буде вказано таке саме значення документації, але я отримаю користь від попереджень, якщо спробую прочитати неініціалізоване поле.
На подальшій думці, здається, немає сенсу зупинятися на цьому. Оскільки в моєму досвіді спроба прочитати неініціалізоване поле є набагато частішою причиною помилок, ніж спроба неправильно прочитати чи змінити приватне чи захищене поле (я це робив уже кілька разів у своїй короткій кар’єрі програмування, але ніколи останнє ), мені здається, що коментувати всі декларації на місцях - не лише публічні - було б найкращою практикою.
Що змушує мене вагатися, це те, що я ніколи не бачив, щоб хтось це робив у своєму коді. Чому ні? Чи є користь у оголошенні полів класу, про які я не знаю? Або я можу змінити конфігурацію PHP якимось чином, щоб змінити поведінку декларацій на місцях, щоб я міг використовувати реальні декларації поля та все-таки скористатися попередженнями "Не визначений властивість"? Або взагалі є щось інше, що я пропустив у своєму аналізі?
TRUE === $variableщоб запобігти випадковому призначенню замість порівняння.