2013-08-28 121 views
1

這可能是一個XY問題,所以我要解釋我想要先做什麼。我試圖創建一個單一的PHP文件來處理我所有的頁面刷新AJAX調用。這意味着我希望能夠發送一個類名稱,以及類構造函數所需的變量列表,然後爲它創建類。如何將一組變量傳遞給一個類

我可以創建類罰款。 $class = new $className();適用於創建類。問題是傳入默認變量。大多數變量都是包含其他類的對象,所以一旦創建了類,我就不能僅僅包含這些變量,我需要在創建類時傳遞它們。

我想沿着線的東西:

$varStr = ''; 
$s = ''; 
foreach($vars as $var) { 
    switch($var['type']) { 
     case 'object': 
      $varStr .= $s . '$' . $var['value']; 
      break; 
     case 'variable': 
      $varStr .= $s . $var['value']; 
    } 
    $s = ','; 
} 
$class = new $className(echo $varStr); 

現在很明顯回聲$ varStr是不會在那裏工作,但我不知道會出現什麼。有什麼我可以做,將輸出變量從我的數組到類構造函數?我試圖做甚至可能嗎?有沒有更好的辦法?

雖然我明白我可以將整個數組傳遞給類構造函數,但這會使程序的主要部分複雜化,而且我寧願放棄使用AJAX刷新的單個頁面的想法。

+0

您可能想了解['Reflection :: newInstanceArgs'](http://php.net/manual/en/reflectionclass.newinstanceargs.php) – Touki

+0

您是否需要將對象傳遞給構造函數,或者您可以傳遞方法調用或數據成員的結果?我問,因爲讓課程依賴於其他班級的工作,將他們緊密地結合在一起,並可能導致一些額外的維護。 –

+0

爲什麼將數組傳遞給構造函數會使事情複雜化? (比你在做什麼) – Ben

回答

1

這是你想要做什麼胡亂猜測,但也許這就是你追求的:

// Generate constructor args 

$args = array(); 
foreach($vars as $var) { 
    switch($var['type']) { 
     $value = $var['value']; 
     case 'object': 
      args[] = ${$value};  // evaluate, I think that's what you want? 
      break; 
     case 'variable': 
      args[] = $value;  // use as is 
      break; 
    } 

} 

// Instanciate class with args 
$class = new ReflectionClass($className); 
$obj = $class->newInstanceArgs($args); 

對於這項工作,它需要$瓦爾以列舉ARGS在正確的訂單由每個類構造函數預期。

+0

我自己得出了這個結論,並且我剛剛檢查並接受了我看到的其他答案。這正是我所想到的。起初,我努力讓自己的頭部圍繞ReflectionClass,但哇,這是PHP可以做的一些聰明的事情。 – Styphon

+0

@deceze應該可以獲得ReflectionClass位的功勞..但是他有足夠的代表點:P – Ben

7

所以基本上你想要傳遞一個可變數量的參數給構造函數?在常規功能中,您可以執行如下操作:

function foo() { 
    $args = func_get_args(); 
    ... 
} 

call_user_func_array('foo', array('bar', 'baz')); 

由於調用機制不同,這對於構造函數不起作用。你可以這樣做:

class Foo { 

    public function __construct() { 
     $args = func_get_args(); 
     ... 
    } 

} 

$class = new ReflectionClass('Foo'); 
$obj = $class->newInstanceArgs(array('bar', 'baz')); 

不過說真的,你應該做的是:

class Foo { 

    public function __construct(array $args) { 
     ... 
    } 

} 

$obj = new Foo(array('bar', 'baz')); 

class Foo { 

    public function __construct($bar, $baz) { 
     ... 
    } 

} 

$obj = new Foo('bar', 'baz'); 

別的是相當瘋狂。如果你的對象構造器如此複雜,你可能需要簡化它。

+0

類的構造函數並不複雜,它只需要類的函數需要的對象和外部變量並將它們存儲起來使用,然後生成HTML就緒輸出命令。 ReflectionClass似乎是要走的路,但我並不真正瞭解它。你可以擴大你的答案嗎? – Styphon

+0

你還想知道什麼?閱讀手冊? http://php.net/manual/en/reflectionclass.newinstanceargs.php – deceze

+0

我認爲@Styphon試圖做的是以某種方式生成* textual * php代碼,他通常會用它來實例化一個給定的類並運行該代碼同一時間... – Ben

相關問題