2015-12-21 52 views
0

我有一個qeustion。我有一些與oop有關的經驗,但我是PHP新手(oop)。我正在努力學習它。是否可能 超載一個consturctor?是否有可能超載在PHP構造函數

在其他語言中有可能重載構造函數,但在PHP不是? 我試過,但我的,我從我的IDE以下消息: 「的方法,在這個類已經difened同名」

class testClass{ 

    public $param1 = ""; 
    public $param2 = ""; 

    public function __construct($param1, $param2){   
     $this->param1 = $param1; 
     $this->param2 = $param2; 

    } 

    public function __construct($param1){ 
     $this->param1 = $param1; 
     //ToDO use function to set pramam2 
    } 
} 
+1

[都能跟得上超載不PHP中支持(http://stackoverflow.com/questions/17316095/does-php-support-method-overloading) –

+0

方法重載在PHP中是不可能的,而不是以其他語言重載的方式,如Java –

+1

。但是,您可以從構造中調用其他函數。 – Andrew

回答

2

做到這一點,最好的辦法是用一個可選的PARAM,因爲別人說評論,PHP不支持重載,因此這將是我的建議:

class Foo 
{ 
    public function __construct($p1, $p2 = null) 
    { 
     $this->p1 = $p1; 
     $this->p2 = $p2; 
    } 
} 

這意味着,你可以選擇創建一個類時使用$p2,但你必須使用$p1

AFAIK,這是的唯一形式超載(如果你可以稱呼它),在PHP尚未存在

編輯

的擴展從kingkero的答案,我想出了這個解決方案,它保持了邏輯構造減函數調用的:

<?php 
class overload 
{ 
    public function __construct() 
    { 
     return $this->switchConstruct(func_get_args()); 
    } 

    protected function switchConstruct(array $args) 
    { 
     switch (count($args)) 
     { 
      case 0: 
       return print "0 params<br />"; 
      case 1: 
       return call_user_func_array(array($this, 'constr1'), $args); 
      case 2: 
       return call_user_func_array(array($this, 'constr2'), $args); 
     } 
     die("Invalid number of args"); 
    } 

    protected function constr1($a) 
    { 
     print "constr1 called<br />"; 
    } 

    protected function constr2($a, $b) 
    { 
     print "constr2 called<br />"; 
    } 
} 
2

不,你不能重載這樣的方法。

你能做的最好是使用可選參數:

class testClass{ 

    public $param1 = ""; 
    public $param2 = ""; 

    public function __construct($param1, $param2=null){   
     $this->param1 = $param1; 
     if($param2){ 
      $this->param2 = $param2; 
     }else{ 
      //ToDO use function to set pramam2 
     } 
    } 
} 
+0

正如我多次被告知,構造函數不應該包含登錄,所以你使用的'if'語句是不適合的對於構造函數 –

+1

@SamSwift웃那麼,構造函數重載通常用於Poor Mans/Bastard注入,無論如何它被認爲是反模式,所以我沒有看到這是如何不同的http://stackoverflow.com/questions/7099406/what -is最真實差間的雜種,注塑和窮人芒 - 注射液 – Steve

1

正如已經指出,你不能像這樣做。不過,如果你希望它是比給定答案更變,嘗試結合使用func_get_args()call_user_func_array()像這樣(demo

class Foo { 
    public function __construct() { 
    $args = func_get_args(); 
    switch (count($args)) { 
     case 2: 
     return call_user_func_array(
      array($this, 'constructorFor2Arguments'), 
      $args 
     ); 
     //... 
    } 
    } 

    protected function constructorFor2Arguments($one, $two) { 
    //... 
    } 
} 
相關問題