17

这将引发错误:

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 在两种情况下都抛出错误?我认为第二种情况比第一种情况更重要(因为我花了 2 个小时来搜索属性中的 d....ned 错字)。

4

2 回答 2

14

您可以使用魔术方法

__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 错误级别设置错误级别

于 2013-06-21T13:19:43.383 回答
11

我可以想象的一种解决方案是(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

于 2013-06-21T13:19:10.030 回答