2011-12-17 111 views
0

我正在使用__get__set方法进行变量重载。PHP重载 - 避免注意:试图获取非对象的属性

在一些情况下,我将另一个目的分配给一个变量,例如:

$object->name->another = $another_object; 

$object,具有__get__set方法。当我尝试访问$object->name->another之前,它已经设置,我得到的错误

注意:试图让非对象

的财产有反正这周围使用超载?而不必检查变量上的isset。

谢谢!

+0

使用`isset`有什么问题? – 2011-12-17 04:12:59

回答

1

$object$object->name需要有__get()/__set()超载,如果你想进行交互,以防止有问题的错误:

$object->name->another = 'something'; 
^^^^^^^^^^^^^ 

例如,你可以让$object::__get()返回一个空stdClass对象,PHP会然后在这种情况下自动为其分配一个公共成员。

0

只要确保您为“名称”返回重载的类。 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; 
2

虽然这不会回答你的问题,它解决了一个重要的方面:

值得一提的是,你不应该让你的魔法__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

+0

因此,您将使用$ object-> name ['another']而不是$ object-> name-> another? – dzm 2011-12-17 04:20:55

+0

不,这只是一个示例实现,您可以在您的类的受保护$ vals属性中存储和访问您的魔法属性。其他发布的答案正确地评估你的问题:你分配给`$ object-> name`的实体应该是一个具有`$ another`属性的实际对象 – rdlowrey 2011-12-17 04:23:50

相关问题