__ Get () Sihirli Yöntemi ile PHP stdClass ()

2 Cevap php

Örnek olarak aşağıdaki kodu atın:

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"

Şimdi, aynı sonucu arşivlemek için çalışıyorum ancak olmadan XPTO sınıfı yazmak zorunda. Benim tahminim böyle bir şey yazmak zorunda olmalıdır:

function xpto()
{
    static $instance = null;

    if (is_null($instance) === true)
    {
    	$instance = new stdClass();
    }

    return $instance;
}

echo xpto()->haha; // doesn't work - obviously

Şimdi, stdClass nesneye __ get () sihirli işlevsellik eklemek mümkündür? Ben değil sanırım, ama emin değilim.

2 Cevap

Hayır, bu mümkün değildir. Sen stdClass şey eklemek olamaz. Ayrıca, her nesne Object doğrudan veya dolaylı bir alt sınıfı olan Java, aksine, bu PHP durum değildir.

class A {};

$a = new A();

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

Ne gerçekten ulaşmak için çalışıyoruz? Sorunuzu biraz "Ben, benim arabanın kapısını kapatmak istiyorum ama bir araba olmadan" gibi :-) geliyor.

Bu doğru değil - onlar "Sen stdClass şey eklemek değil", cassy cevabı konusunda, zaten muhtemelen gitmek için doğru bir yol değildir, küresel kapsamda bir işlevini kullanarak bir singleton deseni elde etmek için çalışıyoruz, ama gibi OP görünüyor.

Sadece onlar için bir değer atayarak stdClass özellikler ekleyebilirsiniz:

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

However, I think you need PHP 5.3+ in order to add methods (anonymous functions / closures), in which case you might be able to do something like the following. However, I've not tried this. But if this does work, can you do the same with the magic __get() method?

Açıklamalarda belirtildiği gibi UPDATE:, dinamik bu şekilde yöntemler ekleyemezsiniz. Atama bir anonymous function (PHP 5.3 +) sadece ve sadece bir kamu malına bir function (kesinlikle bir closure object) atar gelmez.

$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