Как динамически создать объект в PHP? - PullRequest
2 голосов
/ 31 октября 2011

Можем ли мы динамически создавать и инициализировать объект в 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 = $ class должен работать. Но это не работает для меня. Я пытался get_class_vars ($ obj) . Это бросило исключение.

Спасибо

Ответы [ 3 ]

9 голосов
/ 31 октября 2011

Это скорее комментарий, но я оставлю его здесь более заметно:

$class = "MyClass";
$obj = new $class($args);

Это работает. См. new Документы .

8 голосов
/ 31 октября 2011

Вы можете использовать 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.

6 голосов
/ 31 октября 2011

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

  • __ 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;
?>
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...