__get和__set魔术方法无法访问

时间:2012-12-11 09:56:12

标签: php class magic-methods

我有一个类'base'和一个类'loader',看起来像这样。

class base {

    protected $attributes = Array();   
    public $load = null;           

    function __construct() {

        $this->load = loader::getInstance();  
        echo $this->load->welcome(); //prints Welcome foo
        echo $this->load->name; //prints Foo
        echo $this->name; //doesnt print anything and i want it to print Foo

    }


    public function __get($key) {

        return array_key_exists($key, $this->attributes) ? $this->attributes[$key] : null;
    }

    public function __set($key, $value) {

        $this->attributes[$key] = $value;
    }
}

class loader {

    private static $m_pInstance;       

    private function __construct() {

        $this->name = "Foo";

    }

    public static function getInstance() {
        if (!self::$m_pInstance) {
            self::$m_pInstance = new loader();
        }

        return self::$m_pInstance;
    }

    function welcome() {
        return "welcome Foo";
    }

}

$b = new base();

现在我想要的是一种从loader类存储变量并使用$this->variablename从基类访问它们的方法。

我怎样才能做到这一点?我不想使用extends。有什么想法吗?

3 个答案:

答案 0 :(得分:2)

我不觉得你完全理解OOP方式的编码意味着什么。通常Singletons是代码味道,所以我只会警告你:

可能有更好的方法来实现你的目标。如果您提供更多信息,我们将帮助您。目前的形式答案如下:只记得我高度劝阻在你的代码中实现它。

假设您只想在loader类中访问公共(和非静态)this->varname变量base,您应该在基数的开头插入此行类构造函数:

$this->attributes = get_object_vars(loader::getInstance());

这将基本上使用所有加载器公共变量初始化属性数组,以便通过__get()方法可以访问其值。

在旁注中,请查看Dependency Injection design pattern以避免使用单身人士。

答案 1 :(得分:1)

您的__get / __设置方法访问$this->attributes但不访问$this->load 你可以,例如做一些像(伪代码)

的东西
function __get($key) {
  - if $attribute has an element $key->$value return $attribute[$key] else
  - if $load is an object having a property $key return $load->$key else
  - return null;
}

另见:http://docs.php.net/property_exists

答案 2 :(得分:0)

您可以创建静态变量,然后可以从任何地方访问此变量

public statis $var = NULL;

你可以像这样访问它

classname::$var;