Заставить PHP выкинуть ошибку в свойстве undefined

Это вызовет ошибку:

class foo
{
   var $bar;

   public function getBar()
   {
      return $this->Bar; // beware of capital 'B': "Fatal:    unknown property".
   }

}

Но это не будет:

class foo
{
   var $bar;

   public function setBar($val)
   {
      $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar"
   }

}

Как заставить PHP вызывать ошибки в случаях BOTH? Я считаю, что второй случай более критичен, чем первый (так как мне потребовалось 2 часа для поиска d.... ned typo в свойстве).

Ответы

Ответ 1

Вы можете использовать магические методы

__ set() запускается при записи данных в недоступные свойства.

__ get() используется для чтения данных из недоступных свойств.

class foo
{
   var $bar;

   public function setBar($val)
   {
      $this->Bar = $val; // beware of capital 'B': silently defines a new prop "Bar"
   }

   public function __set($var, $val)
   {
     trigger_error("Property $var doesn't exists and cannot be set.", E_USER_ERROR);
   }

   public function  __get($var)
   {
     trigger_error("Property $var doesn't exists and cannot be get.", E_USER_ERROR);
   }

}

$obj = new foo(); 
$obj->setBar('a');

Будет выдана ошибка

Неустранимая ошибка: панель свойств не существует и не может быть установлена. в строке 13

Вы можете установить уровни ошибок в соответствии с уровнями ошибок PHP

Ответ 2

Одним из решений, которое я могу себе представить, будет (ab) с помощью __set и, возможно, property_exists

public function __set($var, $value) {
    if (!property_exists($this, $var)) {
        throw new Exception('Undefined property "'.$var.'" should be set to "'.$value.'"');
    }
    throw new Exception('Trying to set protected / private property "'.$var.'" to "'.$value.'" from invalid context');
}

Демо: http://codepad.org/T5X6QKCI