Come per “invocare” una istanza della classe in PHP?

c’è la possibilità di “invocare” una istanza della classe da una rappresentazione in forma di stringa?

In questo caso mi aspetterei un codice simile a questo:

class MyClass {
  public $attribute;
}

$obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass
$obj->attribute = "Hello World";

Penso che questo deve essere possibile, come PHP SoapClient accetta un elenco di classMappings che viene utilizzato per associare un elemento di WSDL per una Classe PHP. Ma come è SoapClient “invocando” le istanze di classe?

OriginaleL’autore NovumCoder | 2009-10-09

3 Replies
  1. 24
    $class = 'MyClass';
    $instance = new $class;

    Tuttavia, se la tua classe’ costruttore accetta un numero variabile di argomenti, ed è in possesso di tali argomenti in un array (sorta di call_user_func_array), è necessario utilizzare una riflessione:

    $class = new ReflectionClass('MyClass');
    $args  = array('foo', 'bar');
    $instance = $class->newInstanceArgs($args);

    C’è anche ReflectionClass::newInstance, ma fa la stessa cosa come prima opzione di cui sopra.

    Di riferimento:

    Ah serbatoi che facile. 😀 Una domanda, c’è un modo per verificare se la classe esiste veramente? Come: se( classExists( “Classe”)) { $obj = getInstanceOf( “Classe”); }
    C’è class_exists(): php.net/manual/en/function.class-exists.php. Guarda per il secondo argomento però.
    Grazie ragazzi. ReflectionClass è la soluzione perfetta. Beh, ho dimenticato che questo è chiamato Riflesso, non invocando. 🙂
    newInstanceArgs funzione reso la mia giornata. L’ultimo pezzo per completare il mio resolver di dipendenza, quindi grazie! 🙂

    OriginaleL’autore Ionuț G. Stan

  2. 8

    Le altre risposte lavoro in PHP <= 5.5, ma il compito diventa molto più semplice in PHP 5.6, dove non è nemmeno necessario utilizzare la reflection. Basta fare:

    <?php
    
    class MyClass
    {
        public function __construct($var1, $var2)
        {}
    }
    
    $class = "MyClass";
    $args = ['someValue', 'someOtherValue'];
    
    //Here's the magic
    $instance = new $class(...$args);
    Questa risposta ha bisogno di più upvotes. Non aveva idea di “splat” operatore esisteva fino ad oggi! php.net/manual/en/…

    OriginaleL’autore Lars Nyström

  3. 6

    Se il numero di argomenti necessari dal costruttore è noto e costante, si può (come altri hanno suggerito) fare questo:

    $className = 'MyClass';
    $obj = new $className($arg1, $arg2, etc.); 
    $obj->attribute = "Hello World";

    Come alternativa si può utilizzare la Reflection. Questo significa anche che si può offrire un’ampia gamma di argomenti del costruttore se non sapete quante sarà necessario.

    <?php
    $rf = new ReflectionClass('MyClass');
    $obj = $rf->newInstanceArgs($arrayOfArguments);
    $obj->attribute = "Hello World";

    OriginaleL’autore Tom Haigh

Lascia un commento