¿Puede PHP instanciar un objeto a partir del nombre de la clase como una cadena?

83

¿Es posible en PHP crear una instancia de un objeto a partir del nombre de una clase, si el nombre de la clase está almacenado en una cadena?

usuario135295
fuente

Respuestas:

138

Sí, definitivamente.

$className = 'MyClass';
$object = new $className; 
brianreavis
fuente
7
Genial, debería haberlo probado antes de preguntar jeje. ¡Gracias!
user135295
2
@user - demasiado a la derecha. Me pregunto por qué vine a SO directamente en lugar de hacer lo mínimo. lol
Ben
2
De hecho, no es tan evidente. Sé que en Java es algo que se llama reflexión, pero esto es muy simple comparado con eso.
Bartis Áron
4
Si clsss está en el espacio de nombres, use esta $ class = 'PrintData \\'. $ clase; return new $ class ();
Dariux
2
Además, como indica el documento de PHP, si la clase que desea instanciar está dentro de un espacio de nombres, debe especificar el FQN (Nombre completo). Por ejemplo, yo mismo estaba dentro de un espacio de nombres de "App \ Http \ Controllers" y tenía una cadena $ string = 'App \ Models \ Task'; Pensé que si intentaba crear una instancia de la cadena, se rompería, pero en realidad no es necesario agregar un \ al principio.
Matt Kieran
6

Si lo es :

<?php

$type = 'cc';
$obj = new $type; // outputs "hi!"

class cc {
    function __construct() {
        echo 'hi!';
    }
}

?>
Señor Smith
fuente
5

si su clase necesita argumentos , debe hacer esto:

class Foo 
{
   public function __construct($bar)
   {
      echo $bar; 
   }
}

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));
josef
fuente
3

Estático también:

$class = 'foo';
return $class::getId();
Andrew Atkinson
fuente
Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación. - De la crítica
Blackbam
@Blackbam respuesta complementaria relacionada relevante. Por favor comente solo si es útil.
Andrew Atkinson
Es cierto que básicamente funciona de todos modos, sería bueno dar un poco de explicación de su respuesta. La pregunta era "¿puede PHP instanciar un objeto?", Pero el acceso a una función miembro estática no es un acceso a un objeto.
Blackbam
0

Puede realizar una invocación dinámica almacenando su (s) nombre (s) de clase / métodos en un almacenamiento como una base de datos. Suponiendo que la clase sea resistente a errores.

sample table my_table
    classNameCol |  methodNameCol | dynamic_sql
    class1 | method1 |  'select * tablex where .... '
    class1 | method2  |  'select * complex_query where .... '
    class2 | method1  |  empty use default implementation

etc .. Luego en su código usando las cadenas devueltas por la base de datos para los nombres de clases y métodos. Incluso puede almacenar consultas SQL para sus clases, el nivel de automatización depende de su imaginación.

$myRecordSet  = $wpdb->get_results('select * from my my_table')

if ($myRecordSet) {
 foreach ($myRecordSet   as $currentRecord) {
   $obj =  new $currentRecord->classNameCol;
   $obj->sql_txt = $currentRecord->dynamic_sql;
   $obj->{currentRecord->methodNameCol}();
}
}

Utilizo este método para crear servicios web REST.

Hugo R
fuente
1
Y si logro inyectar su base de datos con cualquier número de clases y métodos, soy dueño de toda su API de descanso ... ¡Felicitaciones! NO utilice este código, ¡es muy peligroso!
James Kipling