3

を使用しているクラスがあり__setます。何も設定したくないので、実際にクラス プロパティを設定する前にチェックする承認された変数の配列を用意しています。

ただし、構成時に、__constructメソッドでいくつかのクラス プロパティを設定する必要があり、そのうちのいくつかは承認されたリストにありません。したがって、コンストラクトが発生すると$this->var = $value、もちろん、その変数を設定することは許可されていないという例外が発生します。

どうにかしてこれを回避できますか?

4

2 に答える 2

4

クラス メンバーを宣言します。

class Blah
{
   private $imAllowedToExist;   // no exception thrown because __set() wont be called
}
于 2010-03-18T17:13:54.560 に答える
1

クラスメンバーを宣言するのが最善の策です。それが機能しない場合は$this->isInConstructor、エラーをスローするかどうかを決定するスイッチ ( ?) を使用できます。

一方、メソッドと__getメソッドを使用し__setて、両方をラップされたライブラリにマップすることもできます。

class Foo
{
    private $library;        
    private $trustedValues;

    public function __construct( array $values )
    {
        $this->trustedValues = array( 'foo', 'bar', 'baz' );
        $this->library = new stdClass();
        foreach( $values as $key=>$value )
        {
            $this->library->$key = $value;
        }
    }

    public function __get( $key )
    {
        return $this->library->$key;
    }

    public function __set( $key, $value )
    {
        if( in_array( $key, $this->trustedValues ) )
        {
            $this->library->$key = $value;
        }
        else
        {
            throw new Exception( "I don't understand $key => $value." );
        }
    }
}
于 2010-03-18T17:28:38.200 に答える