How to dynamically instantiate an object in PHP?

2019-01-26 22:32发布

问题:

Can we dynamically create and initialize an object in PHP? This is the normal code:

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);

The above code works fine. Please note that the names of REQUEST parameters are accurately mapped with the members of class MyClass.

But can we do something like this:

$class = "MyClass";
$obj = new $class;

If we can do like this, then can we initialize $obj by using $args.

According to this post, $obj = $class should work. But it does not work for me. I tried get_class_vars($obj). It threw an exception.

Thanks

回答1:

You have to overload some other magic methods:

  • __get (a method that gets called when you call object member)
  • __set (a method that gets called when you want to set object member)
  • __isset
  • __unset

Please see this codepad to see your code rewritten to work with what you want:

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


回答2:

It's more a comment, but I leave it here more prominently:

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

This does work. See newDocs.



回答3:

You can use Reflection to instanciate an object with parameters.

<?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();

See Reflection on php manual.