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 番目のケースは最初のケースよりも重大であると考えています (プロパティの正確なタイプミスを検索するのに 2 時間かかったため)。

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

私が想像できる1つの解決策は、(ab)using__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 に答える