Есть ли лучший способ заблокировать перегрузку свойств? - PullRequest
1 голос
/ 14 декабря 2010
<?php
class Item {
 public function __set($name, $value){
  throw new Exception('Overloading is forbidden.');
 }

 public function __get($name){
  throw new Exception('Overloading is forbidden.');
 }
}

Я хочу убедиться, что я установил все требуемые свойства объекта, но если я неправильно наберу имя свойства, PHP просто добавляет новое свойство, и свойство, которое я хотел инициализировать, остается нулевым.

Ответы [ 3 ]

1 голос
/ 14 декабря 2010

Из вашего комментария:

Я хочу убедиться, что я установил все требуемые свойства объекта, но если я неправильно наберу имя свойства, PHP просто добавляет новое свойство, и свойство, которое я хотел инициализировать, остается нулевым.

Если вы хотите убедиться, что вы установили все необходимые свойства объекта, подумайте о том, чтобы сделать их обязательными аргументами для конструктора, например,

class Item
{
    public function __construct($required, $alsoRequired, $moreRequired)
    {
        // assign to corresponding properties
    }
}

Таким образом, вы можете быть уверены, что объект находится в действительном состоянии.

Если вы не можете установить их при создании объекта, рассмотрите возможность добавления метода валидатора к вашему объекту. Вызовите этот метод, прежде чем делать какие-либо критические действия с вашим объектом, чтобы убедиться, что установлены все необходимые свойства. Это было бы гораздо более полезным дополнением к вашему API, чем реализация защиты от опечаток.

Кроме того, у вас не должно быть проблем с этим, если вы используете правильные сеттеры. Получите доступ к своему объекту через интерфейс вместо непосредственного назначения свойств. Если вы неправильно наберете имя метода, PHP сообщит вам (если вы не внедрили __call).

В обозначениях __get и __set не являются ленивыми заменами для правильных добытчиков и сеттеров. Они являются перехватчиками, которые будут срабатывать при попытке доступа к недоступному свойству. Это гораздо больше связано с обработкой ошибок. Также обратите внимание, что они намного медленнее, чем правильные геттеры и сеттеры.

0 голосов
/ 14 декабря 2010

Используя http://php.net/manual/en/function.get-class-vars.php, вы можете проверить наличие переменной и, например, вызвать исключение при сбое

0 голосов
/ 14 декабря 2010

Простое использование конструктора не решит проблему.Проблема, которую он описывает, очень распространена, и выдает исключение, если вызывается __get или __set.Если вы хотите, вы можете сделать это окончательным, но я не вижу причин, почему вы должны это сделать.Только классы, которым требуются динамические свойства, будут переопределять методы.Единственное улучшение, которое я могу предложить, это заключить определения методов в // DEBUG и // /. Когда вы закончите отладку, вы можете легко запустить замену (// * DEBUG с / * DEBUG) для всехзакодируйте файлы и закомментируйте __get и __set

...