Чи може PHP створити об'єкт із імені класу як рядок?


Відповіді:


138

Так, безумовно.

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

7
Класно, мені слід було це перевірити, перш ніж запитати хе-хе. Дякую!
user135295

2
@user - занадто правильно. Цікаво, чому я прийшов безпосередньо до ТО замість того, щоб робити мінімальний мінімум? lol
Бен

2
Насправді це не так очевидно. Я знаю, що в Java це річ, яка називається відображенням, але це дуже просто в порівнянні з цим.
Бартіс Арон

4
Якщо clsss знаходиться у просторі імен, використовуйте цей $ class = 'PrintData \\'. $ клас; повернути новий $ 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

Відповідна додаткова відповідь на @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.