web-dev-qa-db-fra.com

Pouvez PHP instancier un objet à partir du nom de la classe en tant que chaîne?

Est-il possible dans PHP d'instancier un objet à partir du nom d'une classe, si le nom de la classe est stocké dans une chaîne?

63
user135295

Oui, certainement.

$className = 'MyClass';
$object = new $className; 
109
brianreavis

Oui, ça l'est:

<?php

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

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

?>
5
Mr. Smith

Statique aussi:

$class = 'foo';
return $class::getId();
1
Andrew Atkinson

Vous pouvez effectuer un appel dynamique en stockant votre nom de classe (s)/méthodes dans un stockage tel qu'une base de données . En supposant que la classe est résistante aux erreurs. 

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 .. Ensuite, dans votre code, utilisez les chaînes renvoyées par la base de données pour les noms de classes et de méthodes. vous pouvez même stocker des requêtes SQL pour vos classes, le niveau d'automatisation étant à la hauteur de votre imagination.

$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}();
}
}

J'utilise cette méthode pour créer des services Web REST.

0
Hugo R