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


83

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

Ответы:


138

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

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

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'; Я думал, что если я попытаюсь создать экземпляр строки, она сломается, но на самом деле вам не нужно добавлять \ в начале.
Мэтт Киран


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 для отдыха… Престижность! Пожалуйста, НЕ используйте этот код, это очень опасно!
Джеймс Киплинг
Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.