2009-10-09 4 views
5

есть ли возможность «вызвать» экземпляр класса строковым представлением?Как «вызвать» экземпляр класса в PHP?

В этом случае я бы ожидать код выглядеть следующим образом:

class MyClass { 
    public $attribute; 
} 

$obj = getInstanceOf("MyClass"); //$obj is now an instance of MyClass 
$obj->attribute = "Hello World"; 

Я думаю, что это должно быть возможным, так как в PHP SoapClient принимает список classMappings, который используется для отображения WSDL элемента в PHP класса , Но как SoapClient «вызывает» экземпляры класса?

ответ

22
$class = 'MyClass'; 
$instance = new $class; 

Однако, если ваш класс конструктор принимает переменное число аргументов, и вы держите эти аргументы в массив (вроде call_user_func_array), вы должны использовать отражение:

$class = new ReflectionClass('MyClass'); 
$args = array('foo', 'bar'); 
$instance = $class->newInstanceArgs($args); 

Там есть также ReflectionClass::newInstance, но он делает то же самое, что и первый вариант выше.

Ссылка:

+0

Ах танки, это легко. :-D Еще один вопрос, есть ли способ проверить, действительно ли этот класс существует? Нравится: if (classExists ("MyClass")) { $ obj = getInstanceOf ("MyClass"); } – NovumCoder

+0

Существует 'class_exists()': http://www.php.net/manual/en/function.class-exists.php. Однако обратите внимание на второй аргумент. –

+0

Спасибо, ребята. ReflectionClass - идеальное решение. Ну, я забыл, что это называется Reflection, не вызывающий. :-) – NovumCoder

6

Если количество аргументов, необходимых конструктору известна и неизменна, вы можете (как другие предложили) сделать это:

$className = 'MyClass'; 
$obj = new $className($arg1, $arg2, etc.); 
$obj->attribute = "Hello World"; 

В качестве альтернативы вы можете использовать Reflection. Это также означает, что вы можете предоставить массив аргументов конструктора, если вы не знаете, сколько вам понадобится.

<?php 
$rf = new ReflectionClass('MyClass'); 
$obj = $rf->newInstanceArgs($arrayOfArguments); 
$obj->attribute = "Hello World"; 
6

Остальные ответы будут работать в PHP < = 5.5, но эта задача становится намного проще в PHP 5.6, где вы даже не должны использовать отражение. Просто выполните:

<?php 

class MyClass 
{ 
    public function __construct($var1, $var2) 
    {} 
} 

$class = "MyClass"; 
$args = ['someValue', 'someOtherValue']; 

// Here's the magic 
$instance = new $class(...$args); 
+0

Этот ответ требует большего количества оборотов. Не имел представления, что оператор «splat» даже существовал до сегодняшнего дня! http://php.net/manual/en/migration56.new-features.php#migration56.new-features.splat – Andy

Смежные вопросы