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

3 minutos de lectura

avatar de usuario
usuario135295

¿Es posible en PHP instanciar un objeto a partir del nombre de una clase, si el nombre de la clase se almacena en una cadena?

Sí, definitivamente.

$className="MyClass";
$object = new $className; 

  • Genial, debería haber probado eso antes de preguntar jeje. ¡Gracias!

    – usuario135295

    4 de septiembre de 2009 a las 3:34

  • @usuario – muy bien. Me pregunto por qué vine a SO directamente en lugar de hacer lo mínimo. jajaja

    – ben

    5 de junio de 2013 a las 1:20

  • De hecho, no es tan evidente. Sé que en Java es algo llamado reflexión, pero esto es muy simple comparado con eso.

    – Bartis Aron

    3 mayo 2014 a las 20:34

  • Si clsss está en el espacio de nombres, use este $class = ‘PrintData\\’ . $clase; devolver nueva $clase();

    – Dariux

    23 de enero de 2015 a las 9:20

  • 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 completamente calificado). Por ejemplo, yo mismo estaba dentro de un espacio de nombres de “Aplicación\Http\Controladores” y tenía una cadena $cadena = ‘Aplicación\Modelos\Tarea’; Pensé que si intentaba crear una instancia de la cadena, se rompería, pero en realidad, no es necesario agregar \ al principio.

    –Matt Kieran

    23 de marzo de 2018 a las 12:41

Sí, lo es:

<?php

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

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

?>

si tu clase necesita argumentos usted debe hacer esto:

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

$name="Foo";
$args="bar";
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));

  • Lo que vine a buscar aquí. Gracias

    – jtubre

    6 de marzo a las 1:37

Estático también:

$class="foo";
return $class::getId();

avatar de usuario
Hugo R.

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 es resistente a los 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, use 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}();
}
}

Uso este método para crear servicios web REST.

  • Y si me las arreglo para inyectar su base de datos con cualquier cantidad de clases y métodos, seré dueño de toda su API de descanso… ¡Felicitaciones! ¡NO use este código, es muy peligroso!

    –James Kipling

    18 de agosto de 2020 a las 9:05


  • Y si me las arreglo para inyectar su base de datos con cualquier cantidad de clases y métodos, seré dueño de toda su API de descanso… ¡Felicitaciones! ¡NO use este código, es muy peligroso!

    –James Kipling

    18 de agosto de 2020 a las 9:05


¿Ha sido útil esta solución?