Jak mohu mít více než vloženého konstruktor Php5?

hlasů
0

Mám dva konstruktor:

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

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

Ale to nefunguje? Co se děje, není má být oo v této verzi PHP? (Jen jsem se přenést z PHP4)

Položena 06/12/2008 v 20:31
zdroj uživatelem
V jiných jazycích...                            


4 odpovědí

hlasů
3

Máte-li dobrý důvod chtít, aby argumenty funkce v tomto pořadí, udělat něco takového:

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

Já bych důrazně doporučujeme Daok je odpověď v průběhu tohoto ačkoli.

Odpovězeno 06/12/2008 v 20:42
zdroj uživatelem

hlasů
2

PHP podporuje objektově orientované konstrukty v novějších verzích, ale funkce přetížení není součástí objektového paradigmatu.

Jak již bylo řečeno někým jiným, PHP nepodporuje přetěžování funkcí. V PHP můžete definovat „standardní hodnoty“ pro parametry funkcí. Vaše funkce by mohla vypadat takto, s předpokládaným chováním:

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

Všimněte si záměně s názvy proměnných ve výše uvedeném příkladu! Lepší využití této „funkce“ v PHP bude vypadat, ale budete muset aktualizovat každý volání funkce ve vaší aplikace:

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

Pro čisté-nost bych raději ten druhý.

Odpovězeno 06/12/2008 v 20:42
zdroj uživatelem

hlasů
2

PHP5 neumožňuje přetížený konstruktor.

Alternativly můžete použít funkci pro nastavení, nebo můžete použít tento trik (k dispozici na EE):

function __construct ($var1, $var2 = null)
{
   if (isset($var2))
   {
      //Do one thing
   }
   else
   {
      //Do another
   }
}
Odpovězeno 06/12/2008 v 20:32
zdroj uživatelem

hlasů
1

Dalo by se použít func_get_args spočítat počet předaných argumentů, pak zápas, že až k metodě.

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'
Odpovězeno 10/12/2008 v 18:02
zdroj uživatelem

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more