开发者

php: avoiding __get in certain circumstances?

开发者 https://www.devze.com 2022-12-24 11:39 出处:网络
I have a class where I\'m using __set. Because I don\'t want it to set ju开发者_开发技巧st anything, I have an array of approved variables that it checks before it will actually set a class property.

I have a class where I'm using __set. Because I don't want it to set ju开发者_开发技巧st anything, I have an array of approved variables that it checks before it will actually set a class property.

However, on construct, I want the __construct method to set several class properties, some of which are not in the approved list. So when construct happens, and I do $this->var = $value, I of course get my exception that I'm not allowed to set that variable.

Can I get around this somehow?


Declare the class members:

class Blah
{
   private $imAllowedToExist;   // no exception thrown because __set() wont be called
}


Declaring the class members is your best bet. If that doesn't work, you could have a switch ($this->isInConstructor?) which determines whether to throw the error.

On the other hand, you could also use the __get method as well as the __set method and have both of them map to a wrapped library:

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." );
        }
    }
}
0

精彩评论

暂无评论...
验证码 换一张
取 消