以下面的代码为例:
class xpto
{
public function __get($key)
{
return $key;
}
}
function xpto()
{
static $instance = null;
if (is_null($instance) === true)
{
$instance = new xpto();
}
return $instance;
}
echo xpto()->haha; // returns "haha"
现在,我正在尝试归档相同的结果,但无需编写xpto类。我的猜测是我应该写这样的东西:
function xpto()
{
static $instance = null;
if (is_null($instance) === true)
{
$instance = new stdClass();
}
return $instance;
}
echo xpto()->haha; // doesn't work - obviously
现在,是否可以在stdClass对象中添加__get()魔术功能?我猜不是,但我不确定。
答案 0 :(得分:4)
不,这是不可能的。您无法向stdClass添加任何内容。此外,与Java不同,其中每个对象都是Object的直接或间接子类,而PHP则不是这样。
class A {};
$a = new A();
var_dump($a instanceof stdClass); // will return false
你真正想要实现的目标是什么?你的问题听起来有点像“我想关上车门,但没有车”: - )。
答案 1 :(得分:3)
只需为stdClass赋值即可添加属性:
$obj = new stdClass();
$obj->myProp = 'Hello Property'; // Adds the public property 'myProp'
echo $obj->myProp;
但是,我认为您需要PHP 5.3+才能添加方法(匿名函数/闭包),在这种情况下,您可能会执行以下操作。但是,我没试过这个。但是如果这确实有效,你能用魔法__get()方法做同样的事吗?
更新:如评论中所述,您无法以这种方式动态添加方法。分配anonymous function(PHP 5.3+)就是这样,只需将函数(严格地为closure object)分配给公共属性。
$obj = new stdClass();
$obj->myMethod = function($name) {echo 'Hello '.$name;};
// Fatal error: Call to undefined method stdClass::myMethod()
//$obj->myMethod('World');
$m = $obj->myMethod;
$m('World'); // Output: Hello World
call_user_func($obj->myMethod,'Foo'); // Output: Hello Foo