我有下面的__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分钟内没有发现它。
答案 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()
进行访问。