Может ли PHP создать экземпляр объекта из имени класса в виде строки?

83

Возможно ли в PHP создать экземпляр объекта из имени класса, если имя класса хранится в строке?

user135295
источник

Ответы:

138

Да, определенно.

$className = 'MyClass';
$object = new $className; 
Brianreavis
источник
7
Круто, я должен был это проверить, прежде чем спрашивать хе-хе. Благодаря!
user135295 04
2
@user - тоже верно. Интересно, почему я пришел в SO напрямую, вместо того, чтобы делать минимум? lol
Бен
2
На самом деле это не так очевидно. Я знаю, что в Java это явление называется отражением, но по сравнению с этим это очень просто.
Бартис Арон
4
Если clsss находится в пространстве имен, используйте этот $ class = 'PrintData \\'. $ class; вернуть новый $ class ();
Dariux
2
Кроме того, как указано в документе PHP, если класс, который вы хотите создать, находится в пространстве имен, вы должны указать FQN (полностью определенное имя). Например, я сам находился в пространстве имен «App \ Http \ Controllers», и у меня была строка $ string = 'App \ Models \ Task'; Я думал, что если я попытаюсь создать экземпляр строки, она сломается, но на самом деле вам не нужно добавлять \ в начале.
Мэтт Киран
6

Да это так :

<?php

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

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

?>
Мистер Смит
источник
5

если вашему классу нужны аргументы, вы должны сделать это:

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

$name = 'Foo';
$args = 'bar';
$ref = new ReflectionClass($name);
$obj = $ref->newInstanceArgs(array($args));
Йозеф
источник
3

Статический тоже:

$class = 'foo';
return $class::getId();
Эндрю Аткинсон
источник
Это не дает ответа на вопрос. Чтобы критиковать или запрашивать разъяснения у автора, оставьте комментарий под его сообщением. - Из
отзыва
@Blackbam соответствующий дополнительный ответ. Пожалуйста, комментируйте, только если это полезно.
Эндрю Аткинсон
Правда, в любом случае это работает в основном, было бы неплохо немного пояснить свой ответ. Вопрос был в том, «может ли PHP создать экземпляр объекта», но доступ к статической функции-члену не является доступом к объекту.
Blackbam
0

Вы можете выполнить некоторый динамический вызов, сохранив свои имена классов / методы в хранилище, таком как база данных. Предполагая, что класс устойчив к ошибкам.

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

и т. д. Затем в вашем коде используются строки, возвращаемые базой данных для имен классов и методов. вы даже можете хранить sql-запросы для своих классов, уровень автоматизации которого соответствует вашему воображению.

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

Я использую этот метод для создания веб-сервисов REST.

Хьюго Р
источник
1
И если мне удастся внедрить в вашу базу данных любое количество классов и методов, у меня есть весь ваш API для отдыха… Престижность! Пожалуйста, НЕ используйте этот код, это очень опасно!
Джеймс Киплинг