-1

我有一个类'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();

现在我想要的是一种从加载器类存储变量并使用$this->variablename.

我怎样才能做到这一点?我不想使用extends. 任何想法 ?

4

3 回答 3

2

我觉得您还没有完全理解 OOP 方式编码的含义。通常单身人士是代码味道,所以我会警告你:

可能有更好的方法来实现你的目标。如果您提供更多信息,我们将为您提供帮助。以目前的形式,答案如下;请记住,我非常不鼓励在您的代码中实现它。

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

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

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

在旁注中,请查看依赖注入设计模式以避免使用单例。

于 2012-12-11T11:06:11.450 回答
1

您的 __get/__set 方法访问$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

于 2012-12-11T10:48:58.387 回答
0

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

public statis $var = NULL;

你可以像这样访问它

classname::$var;
于 2012-12-11T10:48:36.017 回答