2011-10-31 75 views
1

我們可以動態地在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

根據this post,$ obj = $ class應該有效。但它不適合我。我試過get_class_vars($ obj)。它拋出了一個例外。

感謝

+4

什麼是您的問題?請發佈不適合你的代碼。 – hakre

+0

可能相關:[PDO :: FETCH_CLASS與多個類](http://stackoverflow.com/q/7741590/367456) – hakre

+0

@hakre:對不起,MySQLi的決定已被採納。不能使用PDO。 –

回答

5

你必須重載一些其他magic methods

  • __get
  • __set(一,當你想設置對象成員被調用方法)(一,當你調用對象的成員被調用方法)
  • __isset
  • __unset

請參閱本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; 
?> 
+0

或者可以從'ArrayObject'擴展具體類並設置一些標誌。 – hakre

+0

@Janis:謝謝。這正是我需要的。 –

5

它更像是一個評論,但我離開這裏更加突出:

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

這並不工作。見newDocs

+0

謝謝。這樣可行。我其實並沒有使用括號。 –

5

您可以使用反射來實例化具有參數的對象。

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

+0

Guery:在你提供的鏈接中,** $ a = new A(); **,我們必須明確指定類名** A **。但我想要的是從名稱將基於某個查詢字符串參數的類中初始化該對象。你可以假設我必須從表單中傳遞類的名字。由於有超過30班,我不喜歡使用IF-ELSE或SWITCH-BREAK。 –

+0

我不明白你的觀點,上面的代碼將基於$ objectClass實例化一個'$ object'。在所有情況下,你的課程都需要存在。我用一個更完整的例子編輯了我的答案。 –

相關問題