【问题标题】:PHP stdClass() with __get() Magic MethodPHP stdClass() 与 __get() 魔术方法
【发布时间】:2010-12-26 03:27:34
【问题描述】:

以如下代码为例:

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

现在,是否可以将 __get() 魔术功能添加到 stdClass 对象?我猜不是,但我不确定。

【问题讨论】:

    标签: php object singleton stdclass


    【解决方案1】:

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

    您可以简单地通过为它们分配一个值来向 stdClass 添加属性:

    $obj = new stdClass();
    $obj->myProp = 'Hello Property';  // Adds the public property 'myProp'
    echo $obj->myProp;
    

    但是,我认为您需要 PHP 5.3+ 才能添加方法(匿名函数/闭包),在这种情况下,您可以执行以下操作。但是,我没有尝试过这个。但如果这确实有效,你能用神奇的 __get() 方法做同样的事情吗?

    更新: 如 cmets 所述,您不能以这种方式动态添加方法。分配 anonymous function (PHP 5.3+) 就是这样做的,只需将 function(严格来说是 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
    

    【讨论】:

    • 这不像描述的那样工作,不,你不能对__get做同样的事情。这不是您要附加的方法,而是一个函数。 codepad.viper-7.com/nn4h0J
    • 我确认这确实有效,但如前所述,该方法是一个属性,必须按原样使用。
    【解决方案2】:

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

    class A {};
    
    $a = new A();
    
    var_dump($a instanceof stdClass); // will return false
    

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

    【讨论】:

    • 感谢 Cassy,我认为可能有一种晦涩的方法来创建某种 lambda 类,但我想不是。谢谢您的意见。 =)
    猜你喜欢
    • 1970-01-01
    • 2011-06-10
    • 2015-07-23
    • 2011-04-26
    • 1970-01-01
    • 2012-04-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多