2009-10-09 6 views
5

¿hay alguna posibilidad de "invocar" una instancia de clase mediante una representación de cadena?¿Cómo "invocar" una instancia de clase en PHP?

en este caso yo esperaría código para tener este aspecto:

class MyClass { 
    public $attribute; 
} 

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

Creo que esto debe ser posible, como SoapClient de PHP acepta una lista de classMappings que se utiliza para asignar un elemento de WSDL para una clase PHP . Pero, ¿cómo está SoapClient "invocando" las instancias de la clase?

Respuesta

22
$class = 'MyClass'; 
$instance = new $class; 

Sin embargo, si su constructor de la clase acepta un número variable de argumentos, y que exija que los argumentos en un array (especie de call_user_func_array), usted tiene que utilizar la reflexión:

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

Hay también ReflectionClass::newInstance, pero hace lo mismo que la primera opción anterior.

Referencia:

+0

Ah tanques, así de fácil. :-D Una pregunta más, ¿hay alguna manera de probar si esa clase realmente existe? Me gusta: if (classExists ("MyClass")) { $ obj = getInstanceOf ("MyClass"); } – NovumCoder

+0

Hay 'class_exists()': http://www.php.net/manual/en/function.class-exists.php. Sin embargo, ten cuidado con el segundo argumento. –

+0

Gracias chicos. ReflectionClass es la solución perfecta. Bueno, olvidé que esto se llama Reflexión no invocando. :-) – NovumCoder

6

Si es conocida y constante el número de argumentos necesarios por el constructor, puede (como han sugerido otros) hacer esto:

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

Como alternativa puede usar Reflection. Esto también significa que puede proporcionar una matriz de argumentos de constructor si no sabe cuántos necesitará.

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

Las otras respuestas trabajarán en PHP < = 5,5, pero esta tarea se hace mucho más fácil en PHP 5.6 en la que ni siquiera tiene que utilizar la reflexión. Solo hazlo:

<?php 

class MyClass 
{ 
    public function __construct($var1, $var2) 
    {} 
} 

$class = "MyClass"; 
$args = ['someValue', 'someOtherValue']; 

// Here's the magic 
$instance = new $class(...$args); 
+0

Esta respuesta necesita más votos positivos. ¡No tenía idea de que el operador de "splat" existiera hasta hoy! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy

Cuestiones relacionadas