Рассмотрим следующий код, в котором сеттер преднамеренно нарушен из-за обыденной ошибки программирования, которую я несколько раз делал в прошлом:
<?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
чтобы предотвратить случайное назначение, а не сравнение.