Заставить 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