我正在使用__get
和__set
方法进行变量重载。PHP重载 - 避免注意:试图获取非对象的属性
在一些情况下,我将另一个目的分配给一个变量,例如:
$object->name->another = $another_object;
$object
,具有__get
和__set
方法。当我尝试访问$object->name->another
之前,它已经设置,我得到的错误
注意:试图让非对象
的财产有反正这周围使用超载?而不必检查变量上的isset。
谢谢!
我正在使用__get
和__set
方法进行变量重载。PHP重载 - 避免注意:试图获取非对象的属性
在一些情况下,我将另一个目的分配给一个变量,例如:
$object->name->another = $another_object;
$object
,具有__get
和__set
方法。当我尝试访问$object->name->another
之前,它已经设置,我得到的错误
注意:试图让非对象
的财产有反正这周围使用超载?而不必检查变量上的isset。
谢谢!
不$object
但$object->name
需要有__get()
/__set()
超载,如果你想进行交互,以防止有问题的错误:
$object->name->another = 'something';
^^^^^^^^^^^^^
例如,你可以让$object::__get()
返回一个空stdClass
对象,PHP会然后在这种情况下自动为其分配一个公共成员。
只要确保您为“名称”返回重载的类。 PHP将获取属性,然后尝试在生成的对象上设置第二个属性。
<?php
class Bob {
public function __get($name) {
return new Jim();
}
}
class Jim extends Bob {
public function __get($name) {
return 12;
}
}
$b = new Bob();
echo $b->someJim->apples;
虽然这不会回答你的问题,它解决了一个重要的方面:
值得一提的是,你不应该让你的魔法__get
和__set
方法,以提高该通知。 “最佳实践”是抛出专门为此设计的新(ish)SPL异常类型之一。例如:
public function __get($name)
{
if (isset($this->vals[$name])) {
return $this->vals[$name];
} else {
$msg = "Invalid property: '$name' does not exist";
throw new OutOfBoundsException($msg);
}
}
而对于__set ...
public function __set($name, $val)
{
if (isset($this->vals[$name])) {
$this->vals[$name] = $val;
} else {
$msg = "Invalid property: '$name' does not exist";
throw new OutOfBoundsException($msg);
}
}
这里有新的SPL异常类型的主题a link to a helpful article。
使用`isset`有什么问题? – 2011-12-17 04:12:59