【问题标题】:How to dynamically instantiate an object in PHP?如何在 PHP 中动态实例化一个对象?
【发布时间】:2011-12-18 14:49:26
【问题描述】:

我们可以在 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;

如果我们可以这样做,那么我们可以使用 $args 来初始化 $obj。

根据this post,$obj = $class 应该可以工作。但这对我不起作用。我试过 get_class_vars($obj)。它引发了异常。

谢谢

【问题讨论】:

  • 您的问题/问题是什么?请发布不适合您的代码。
  • 这个问题也与动态实例化对象有关(除了 PDO,这使得询问的人更复杂),您可能找到一些有关填充新对象的有用信息在各种答案中。

标签: php oop object dynamic


【解决方案1】:

这更像是一个评论,但我把它留在这里更显眼:

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

这确实有效。见newDocs。

【讨论】:

    【解决方案2】:

    你必须重载其他一些magic methods:

    • __get(调用对象成员时调用的方法)
    • __set(当你想设置对象成员时调用的方法)
    • __isset
    • __未设置

    请查看此codepad 以查看您的代码被重写以使用您想要的内容:

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

    【讨论】:

    • 或者从ArrayObject扩展具体类并设置一些标志。
    • @Janis:谢谢。这正是我所需要的。
    【解决方案3】:

    您可以使用反射来实例化带有参数的对象。

    <?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 手册中的Reflection。

    【讨论】:

    • Guery:在您提供的链接中,在 $a = new A(); 行中,我们必须明确指定类名 A。但我想要的是从一个类中初始化对象,该类的命名将基于一些查询字符串参数。您可以假设我必须从表单中传递类的名称。由于有 30 多个类,我不喜欢使用 IF-ELSE 或 SWITCH-BREAK。
    • 我不明白你的意思,上面的代码将基于 $objectClass 实例化一个$object。在所有情况下,您的班级都需要存在。我用一个更完整的例子编辑了我的答案。
    猜你喜欢
    • 2016-05-20
    • 2017-06-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2012-01-13
    • 2018-12-13
    相关资源
    最近更新 更多