Question

Prenez le code suivant comme exemple:

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"

Maintenant, je suis en train d'archiver le même résultat, mais sans avoir à écrire de la xpto classe.Ma conjecture est que je devais écrire quelque chose comme ceci:

function xpto()
{
    static $instance = null;

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

    return $instance;
}

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

Maintenant, est-il possible d'ajouter __get() la magie de la fonctionnalité de l'objet stdClass?Je suppose que non, mais je ne suis pas sûr.

Était-ce utile?

La solution

Non, il est impossible. Vous ne pouvez pas ajouter quoi que ce soit à stdClass. En outre, contrairement à Java, où chaque objet est une sous-classe directe ou indirecte de l'objet, ce n'est pas le cas en PHP.

class A {};

$a = new A();

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

Qu'est-ce que vous essayez vraiment d'atteindre? Votre question sonne un peu comme « Je veux fermer la porte de ma voiture, mais sans avoir une voiture »: -).

Autres conseils

L'OP dirait qu'ils essaient de parvenir à un singleton pattern à l'aide d'une fonction dans la portée globale qui n'est probablement pas la bonne façon de procéder, mais de toute façon, concernant Cassy réponse, "Vous ne pouvez pas ajouter quoi que ce soit à stdClass" - ce n'est pas vrai.

Vous pouvez ajouter des propriétés à la stdClass simplement par affectation d'une valeur à eux:

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

Cependant, je pense que vous avez besoin de PHP 5.3+, afin d'ajouter des méthodes (fonctions anonymes / fermetures), dans ce cas, vous pourriez être en mesure de faire quelque chose comme ce qui suit.Cependant, je n'ai pas essayé ce.Mais si cela fonctionne, vous pouvez faire de même avec les magiques __get() la méthode?

Mise à JOUR: Comme indiqué dans les commentaires, vous ne pouvez pas ajouter dynamiquement des méthodes de cette manière.L'attribution d'une fonction anonyme (PHP 5.3+) ne fait juste que, et assigne simplement un la fonction (strictement une fermeture de l'objet) à une propriété publique.

$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
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top