簡體   English   中英

如何在PHP中動態實例化對象?

[英]How to dynamically instantiate an object in 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;

如果我們可以這樣做,那么我們可以使用$ args初始化$ obj

根據這篇文章$ obj = $ class應該有效。 但它對我不起作用。 我試過get_class_vars($ obj) 它引發了一個例外。

謝謝

這是一個評論,但我更加突出地留在這里:

$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手冊上的反思

你必須重載一些其他魔術方法

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM