99 votes

PHP peut-il instancier un objet à partir du nom de la classe sous forme de chaîne de caractères ?

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

161voto

brianreavis Points 6351

Yep, définitivement.

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

9 votes

Cool, j'aurais dû tester ça avant de demander hehe. Merci !

2 votes

@user - trop juste. Je me demande pourquoi je suis venu directement à SO au lieu de faire le strict minimum ? lol

2 votes

En fait, ce n'est pas si évident. Je sais qu'en Java il y a une chose appelée réflexion, mais ceci est très simple comparé à cela.

10voto

josef Points 306

Si votre classe a besoin arguments vous devriez faire ça :

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

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

9voto

Mr. Smith Points 3224

Oui, c'est vrai. :

<?php

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

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

?>

5voto

Andrew Atkinson Points 556

Statique aussi :

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

0voto

Hugo R Points 1445

Vous pouvez effectuer des invocations dynamiques en stockant vos noms de classe et vos méthodes dans une base de données, par exemple. En supposant que la classe est résiliente pour les 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, vous utilisez les chaînes renvoyées par la base de données pour les noms des classes et des méthodes. Vous pouvez même stocker des requêtes sql pour vos classes, le niveau d'automatisation dépend 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.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X