2008-12-06 52 views
0

我有兩個構造函數:我如何在PHP5中加載構造函數?

function clsUsagerEmailUserName($nickName, $email) 
{ 
     $this->nickName = $nickName; 
     $this->email = $email;    
} 

function clsUsagerEmailUserName($email) 
{ 
     $this->email = $email;    
} 

但是這是不工作?有什麼不對,在這個版本的PHP中不應該是OO? (我只是從PHP4遷移)

回答

3

PHP5不允許重載構造函數。

Alternativly您可以使用函數來設置,也可以使用這一招(在EE發現):

function __construct ($var1, $var2 = null) 
{ 
    if (isset($var2)) 
    { 
     //Do one thing 
    } 
    else 
    { 
     //Do another 
    } 
} 
3

如果你有一個很好的理由要保留的函數參數的順序,這樣做這個:

function __construct() 
{ 
    switch (func_num_args()) { 
     case 1: 
      $this->email = func_get_arg(0); 
     break; 
     case 2: 
      $this->nickName = func_get_arg(0); 
      $this->email = func_get_arg(1); 
     break; 
     // [...] 
     default: 
      throw new Exception('Wrong number of values passed to constructor'); 
    } 
} 

我強烈推薦Daok的回答。

2

PHP在新版本中支持面向對象的構造,但函數重載不是面向對象的範例的一部分。如前所述,PHP不支持重載函數。在PHP中,您可以爲函數參數定義「默認值」。你的函數可以這個樣子,你的預期行爲:

function clsUsagerEmailUserName($nickName, $email = NULL) 
{  
    if ($email <> NULL) 
    { 
     $this->nickName = $nickName; 
     $this->email = $eMail; 
    } 
    else 
    { 
     $this->email = $nickName; 
    } 
} 

注意的混亂,在上面的例子中的變量名!更好地利用在PHP這個「功能」的應該是這樣的,但是你需要在你的應用程序更新的每個函數調用:

function clsUsagerEmailUserName($email, $nickName = NULL) 
{ 
    $this->email = $email; 
    if ($nickName <> NULL) 
     $this->nickName = $nickName; 
} 

對於清潔內斯我寧願第二個。

1

您可以使用func_get_args來計算傳遞參數的數量,然後將其與方法進行匹配。

abstract class AlmostPolymorphicObject { 
    public function __construct() { 
    $args = func_get_args(); 
    $argsCount = count($args); 
    $callback = array($this, '_construct'.$argsCount); 
    if (!is_callable($callback)) { 
     throw new Exception('no valid constructor for param count '.$argsCount); 
    } 
    return call_user_func_array($callback, $args); 
    } 
} 

class FooBar extends AlmostPolymorphicObject { 
    private function _construct0() { 
    } 

    private function _construct1($var1) { 
    } 

    private function _construct2($var1, $var2) { 
    } 
} 

$var = new FooBar(); // would run _construct0 
$var = new FooBar('var'); // would run _construct1 
$var = new FooBar('var','var'); // would run _construct2 
$var = new FooBar('var','var', 'asdasd'); // would throw error 'no valid constructor for param count 3' 
相關問題