我有一个Class X,我从那里访问我的应用程序的其余类。此访问是动态完成的。下面的示例代码(demo here):
<?
class ClassX
{
var $ClassA;
var $ClassB;
function __construct()
{
$this->ClassA = new ClassA();
$this->ClassB = new ClassB();
}
}
class ClassA
{
function methodA($param)
{
echo $param;
}
}
class ClassB
{
function methodB($param)
{
echo $param + 1;
}
}
/*I can do this for class A*/
$class = "ClassA";
$method = "methodA";
$param = array("some text");
/*or this for class B*/
//$class = "ClassB";
//$method = "methodB";
//$param = array(5);
$objX = new ClassX();
$chain = $objX->{$class};
call_user_func_array(array($chain, $method), $param);
?>
我在想是否可以更进一步,摆脱X中的显式对象实例。
在上面的代码中,我“卡住”了A和B.
我正在寻找一种方法来构建一个加载不同模块的应用程序,但不知道哪些模块会被直接加载。因此,如果明天我有一个C模块,我不必更改X.如果我不再支持B,同样适用。
我在X中试过这样的事情:
function __get($object)
{
$this->$object = new $object();
}
然后我收到一个无效的回调错误,所以我猜call_user_func_array不在桌面上
我可以做我想要实现的目标吗?
解:
Spyric钉了它!我只需要在__get()
中返回一个function __get($object)
{
$this->$object = new $object();
return $this->$object;
}
最终代码here
答案 0 :(得分:2)
过去我需要类似于存储数据的东西。代码看起来很简单:
class ClassX
{
var classes = array();
function __construct()
{
}
}
getter:
function __get($object)
{
if(!isset($this->classes[$object]))
$this->classes[$object] = new $object();
return $this->classes[$object];
}
<强> UPD:强> 之后你可以使用
$class = "ClassC";
$method = "methodA";
$param = array("some text");
$objX = new ClassX();
$chain = $objX->{$class};
和$ chain将拥有来自ClassC的对象
如果您不需要为每次调用重置对象的值$objX->{$class}
,请删除if(!isset($this->classes[object]))
答案 1 :(得分:0)
似乎您需要动态构建这些对象。尝试Reflection扩展,这是一个示例:
$dateTimeRefl = new ReflectionClass('DateTime');
$dynamicallyBuildDateTime = $dateTimeRefl->newInstance('2013-01-01');
有两种方法:newInstance()和newInstanceArgs(),它们等同于call_user_func()和call_user_func_array()。
你需要PHP 5.2或更高版本。