__set没有被调用

时间:2011-12-08 17:30:26

标签: php

我有下面的__set方法,它没有被解雇。请注意方法顶部的echo '__set'

public function __set($name, $value){
        echo '__set';
        if($this->{$name}==$value)  return;
        switch($name){
            case 'title':
            case 'body':
            case 'template':
            case 'date':
            case 'pageType':
                if(!$this->exists()){
                    $this->DB->insert('posts', array($name, $value));
                    $this->ID=($this->DB->autoIncrement('posts')-1)<1?1:($this->DB->autoIncrement('posts')-1);
                }
                else{
                    $this->DB->update('posts', array($name => $value));
                }
                $this->{"$name"}=$value;
                return;
            break;
        }
        $this->{$name}=$value;
    }

当我调用$class->__set(...);时,该方法可以正常工作,但在我$class->title='whatever'时则无法正常工作。希望只是一个小错误或其他东西,但在最后15分钟内没有发现它。

1 个答案:

答案 0 :(得分:4)

如果您遇到类似于问题评论中提到的名称冲突,您可以使用__set()实现__get()来完成您尝试执行的操作:

class MyMagicClass
{
  protected $vals = array();

  public function __get($name)
  {
    if (isset($this->vals[$name])) {
      return $this->vals[$name];
    }
    throw new OutOfBoundsException("$name is not a valid property");
  }

  public function __set($name, $value)
  {
    $this->vals[$name] = $value;
    // do your other stuff here ...
  }
}

__get()__set()类似,仅在请求的对象属性不存在或不可访问(受保护/私有)时调用。如果您像上面的示例一样执行此操作,则所有“魔术”对象属性都将存储在受保护的$vals数组中,并通过__get()__set()进行访问。