Можем ли мы динамически создавать и инициализировать объект в PHP? Это обычный код:
class MyClass{ var $var1 = null; var $var2 = null; . . public function __construct($args){ foreach($args as $key => $value) $this->$key = $value; } } --------------------- $args = ($_SERVER['REQUEST_METHOD'] == "POST") ? $_POST : $_REQUEST; $obj = new MyClass($args);
Вышеприведенный код работает нормально. Обратите внимание, что имена параметров REQUEST точно сопоставляются с членами класса MyClass .
Но можем ли мы сделать что-то вроде этого:
$class = "MyClass"; $obj = new $class;
Если мы сможем это сделать, тогда мы можем инициализировать $ obj , используя $ args .
Согласно этому сообщению , класс $ obj = $ должен работать. Но это не работает для меня. Я попробовал get_class_vars ($ obj) . Это заставило исключение.
благодаря
Вы должны перегрузить некоторые другие магические методы :
Пожалуйста, просмотрите этот код, чтобы увидеть, как ваш код переписан для работы с тем, что вы хотите:
<?php class MyClass{ var $properties = array(); public function __construct($args){ $this->properties = $args; } public function __get($name) { echo "Getting '$name'\n"; if (array_key_exists($name, $this->properties)) { return $this->properties[$name]; } return null; } } $args = array("key1" => "value1", "key2" => "value2"); $class = "MyClass"; $obj = new $class($args); echo "key1:". $obj->key1; ?>
Это скорее комментарий, но я оставляю его здесь более заметно:
$class = "MyClass"; $obj = new $class($args);
Это работает. См. new
документы .
Вы можете использовать Reflection для инициализации объекта с параметрами.
<?php class Foo { protected $_foo; protected $_bar; public function __construct($foo, $bar) { $this->_foo = $foo; $this->_bar = $bar; } public function run() { echo $this->_foo . ' ' . $this->_bar . PHP_EOL; } } $objectClass = 'Foo'; $args = array('Hello', 'World'); $objectReflection = new ReflectionClass($objectClass); $object = $objectReflection->newInstanceArgs($args); $object->run();
См. « Отражение» в руководстве по php.