Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

How to dynamically instantiate an object in PHP?

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

like image 676
Kumar Kush Avatar asked Oct 31 '11 09:10

Kumar Kush


2 Answers

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

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

This does work. See newDocs.

like image 54
hakre Avatar answered Sep 19 '22 17:09

hakre


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;
?>
like image 36
Janis Veinbergs Avatar answered Sep 21 '22 17:09

Janis Veinbergs