3

例として、次のコードを取り上げます。

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 オブジェクトに追加することは可能ですか? ないと思いますが、よくわかりません。

4

2 に答える 2

4

いいえ、できません。stdClass には何も追加できません。また、すべてのオブジェクトが Object の直接的または間接的なサブクラスである Java とは異なり、これは PHP には当てはまりません。

class A {};

$a = new A();

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

あなたは本当に何を達成しようとしていますか?あなたの質問は、「車を持っていないのに、車のドアを閉めたい」のように聞こえます:-)。

于 2009-12-13T09:37:05.723 に答える
3

OPは、グローバルスコープの関数を使用してシングルトンパターンを達成しようとしているように見えますが、これはおそらく正しい方法ではありませんが、とにかく、Cassyの答え「stdClassには何も追加できません」-これは真実ではありません。

プロパティに値を代入するだけで、stdClass にプロパティを追加できます。

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

ただし、メソッド (無名関数/クロージャー) を追加するには、PHP 5.3+ が必要だと思います。その場合、次のようなことができる場合があります。ただし、これは試していません。しかし、これが機能する場合、魔法の __get() メソッドで同じことができますか?

更新:コメントに記載されているように、この方法でメソッドを動的に追加することはできません。匿名関数(PHP 5.3+) を割り当てると、それが行われ、単純に関数(厳密にはクロージャー オブジェクト) がパブリック プロパティに割り当てられます。

$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
于 2010-07-05T16:30:28.893 に答える