带有__get()Magic方法的PHP stdClass()

时间:2009-12-13 09:32:09

标签: php object singleton stdclass

以下面的代码为例:

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()魔术功能?我猜不是,但我不确定。

2 个答案:

答案 0 :(得分:4)

不,这是不可能的。您无法向stdClass添加任何内容。此外,与Java不同,其中每个对象都是Object的直接或间接子类,而PHP则不是这样。

class A {};

$a = new A();

var_dump($a instanceof stdClass); // will return false

你真正想要实现的目标是什么?你的问题听起来有点像“我想关上车门,但没有车”: - )。

答案 1 :(得分:3)

OP看起来他们正在尝试使用全局范围内的函数来实现单例模式,这可能不是正确的方法,但无论如何,关于Cassy的答案,“你不能向stdClass添加任何东西” - 这是不是真的。

只需为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