Как динамически создавать объекты в PHP?

Можем ли мы динамически создавать и инициализировать объект в 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) . Это заставило исключение.

благодаря

Вы должны перегрузить некоторые другие магические методы :

  • __get (метод, вызываемый при вызове члена объекта)
  • __set (метод, который вызывается, когда вы хотите установить объект-член)
  • __isset
  • __unset

Пожалуйста, просмотрите этот код, чтобы увидеть, как ваш код переписан для работы с тем, что вы хотите:

 <?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.