簡體   English   中英

如何在Php5中超載構造函數?

[英]How can I have over loaded constructor in Php5?

我有兩個構造函數:

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

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

但這行不通嗎? 怎么了,在此版本的PHP中不應該是OO嗎? (我只是從PHP4遷移)

如果您有充分的理由要按此順序保留函數參數,請執行以下操作:

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給出答案。

PHP5不允許重載構造函數。

或者,您可以使用函數進行設置,也可以使用以下技巧(在EE上找到):

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

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;
}

為了清潔,我更喜歡第二個。

您可以使用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'

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM