есть ли возможность «вызвать» экземпляр класса строковым представлением?
В этом случае я бы ожидал, что код будет выглядеть так:
class MyClass { public $attribute; } $obj = getInstanceOf( "MyClass"); //$obj is now an instance of MyClass $obj->attribute = "Hello World";
Я думаю, что это должно быть возможно, так как SoapClient от PHP принимает список classMappings, который используется для сопоставления элемента WSDL с классом PHP. Но как SoapClient «вызывает» экземпляры класса?
$class = 'MyClass'; $instance = new $class;
Однако, если конструктор класса принимает переменное количество аргументов, и вы держите эти аргументы в массиве (вроде call_user_func_array
), вы должны использовать отражение:
$class = new ReflectionClass('MyClass'); $args = array('foo', 'bar'); $instance = $class->newInstanceArgs($args);
Существует также ReflectionClass::newInstance
, но он делает то же самое, что и первый вариант выше.
Справка:
Если количество аргументов, необходимых конструктору, известно и постоянно, вы можете (как предложили другие) сделать это:
$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";
Другие ответы будут работать в 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);