Ben PHP5'ta Nasıl yüklü kurucusuna üzerinde olabilir?

4 Cevap php

Ben iki kurucu var:

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

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

Ama bu çalışmıyor? Neyin var, PHP'nin bu versiyonunda Oo gerekiyordu değil mi? (Ben sadece PHP4 göç)

4 Cevap

PHP5 fazla yüklenmiş kurucu izin vermez.

Alternativly (EE bulunan) bu hile ya da ayarlamak kullanabileceğiniz işlevini kullanabilirsiniz:

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

Eğer böyle bir şey yapmak, bu sırayla fonksiyon argümanları tutmak istediğiniz için iyi bir nedeniniz varsa:

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

Ben kuvvetle bu olsa üzerinde Daok cevabını tavsiye ederim.

PHP yeni sürümlerinde nesne yönelimli yapıları destekler, ancak fonksiyon aşırı yükleme nesne yönelimli paradigmanın parçası değildir.

Olarak zaten başkası tarafından dedi, PHP yüklenme fonksiyonları desteklemiyor. PHP Eğer fonksiyon parametreleri için "varsayılan değerleri" tanımlayabilirsiniz. Sizin işlevi beklenen davranışı ile, bu gibi görünebilir:

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

Yukarıdaki örnekte değişken adları ile Note karışıklık! PHP, bu "özelliği" daha iyi kullanılması, bu gibi görünür, ama size uygulamadaki her işlev çağrısı güncellemeniz gerekir:

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

Temiz-lik i ikinci bir tercih ederim.

Sen bir yönteme o kadar maç sonra geçirilen argümanların sayısını saymak için func_get_args kullanabilirsiniz.

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'