我有一个类'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
。有什么想法吗?
答案 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;
}
答案 2 :(得分:0)
您可以创建静态变量,然后可以从任何地方访问此变量
public statis $var = NULL;
你可以像这样访问它
classname::$var;