Рассмотрим следующий код, в котором сеттер преднамеренно нарушен из-за обыденной ошибки программирования, которую я несколько раз делал в прошлом:
<?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
чтобы предотвратить случайное назначение, а не сравнение.Ответы:
Вы должны всегда объявлять свойства вашего класса заранее. Хотя PHP является динамическим языком и будет рад, если вы создадите свои свойства во время выполнения, у этого пути есть несколько недостатков.
Проблема, которую вы описали, на самом деле незначительна по сравнению с проблемой не декларирования ваших свойств в определении вашего класса. Вот хорошее решение.
Привыкайте объявлять по умолчанию для ваших свойств.
За исключением свойств, которые будут хранить объекты, это будет охватывать большинство базовых типов, которые вы будете хранить. Свойства, которые будут хранить объекты, могут быть установлены в вашем конструкторе.
Хорошее правило для проектирования классов заключается в том, что после того, как ваш объект был создан и ваш конструктор запущен, у вас не должно быть никаких свойств "undefined".
источник
Я работал над кодом, который использовал динамически созданные свойства объекта. Я думал, что использование динамически создаваемых свойств объекта было довольно круто (правда, на мой взгляд). Однако моей программе потребовалось 7 секунд для запуска. Я удалил свойства динамического объекта и заменил их свойствами объекта, объявленными как часть каждого класса (в данном случае public). Процессорное время увеличилось с 7 секунд до 0,177 секунд. Это довольно существенно.
Возможно, я делал что-то не так, как использовал свойства динамического объекта. Также возможно, что моя конфигурация нарушена каким-то образом. Конечно, я должен сказать, что у меня очень простая ванильная конфигурация PHP на моей машине.
источник