2014-09-12 154 views
2

如何在類實例化中傳遞數組作爲構造函數參數?傳遞數組作爲類構造函數的參數

abstract class Person { 

    protected function __construct(){ 

    } 

    public static final function __callStatic($name, $arguments){ 
     return new $name($arguments); 
    } 

} 

class Mike extends Person { 

    protected function __construct($age, $hobby){ 
     echo get_called_class().' is '.$age.' years old and likes '.$hobby; 
    } 
} 


// ============================================= 

Person::Mike(15, 'golf'); 

這應該輸出

邁克15歲,喜歡打高爾夫球

但我得到的第二個參數Mike的構造缺少的,因爲從__callStatic這兩個參數都爲發數組到$age。我的問題是我怎樣才能發送他們作爲參數,而不是數組?

+2

這已經有一段時間,因爲我用PHP的工作,但你不應該在構造函數,而不是1使用2x_? – Jonast92 2014-09-12 15:48:21

+0

@ Jonast92我的錯誤。 Thx指出它 – 2014-09-12 15:50:12

回答

2

您可以使用Reflection此:

public static function __callStatic($name, $arguments){ 
    $reflector = new ReflectionClass($name); 
    return $reflector->newInstanceArgs($arguments); 
} 
+0

是的,謝謝! – 2014-09-12 16:00:26

1

使用call_user_func_array()http://fi1.php.net/manual/en/function.call-user-func-array.php和工廠方法:

class Mike extends Person { 

    public static function instantiate($age, $hobby) { 
     return new self($age, $hobby); 
    } 
    protected function __construct($age, $hobby){ 
     echo get_called_class().' is '.$age.' years old and likes '.$hobby; 
    } 
} 

,然後作出邁克像這樣:

abstract class Person { 

    protected function __construct(){ 

    } 

    public static final function __callStatic($name, $arguments){ 
     return call_user_func_array(array($name, 'instantiate'), $args); 
    } 

} 
+0

我不能那樣做。我需要能夠調用'Person :: Mike()' – 2014-09-12 15:56:51

+0

這就是那個。 – Schlaus 2014-09-12 15:57:24

+0

但後來我必須在所有類中實現'instantiate',這並不聰明。 – 2014-09-12 15:59:21

0

您使用的是靜態的範圍resolutor錯誤

Person::Mike(15, 'golf'); 

這將意味着你有一個靜態方法Mike我在課程Person的旁邊,你在靜態地調用它。

相反,你要實例Mike

$mike = new Mike(15, 'golf'); 

如果你想從Person調用靜態的東西,因爲Mike擴展它,Mike也可以靜態地調用它。

Mike::staticMethod($args); 
+0

不,我不想那樣做。我有一個Person類可以返回人類的實例,我明確不希望能夠調用人類的構造函數,這就是爲什麼他們受到保護。 – 2014-09-12 15:55:35

+0

我添加了一些東西來更好地處理您的靜態需求 – Machavity 2014-09-12 15:57:58

相關問題