0

私は2つのコンストラクターを持っています:

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

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

しかし、これは機能していませんか?このバージョンの PHP ではオブジェクト指向ではないはずなのでしょうか? (私はPHP4から移行したばかりです)

4

4 に答える 4

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

ただし、これよりもダオクの答えを強くお勧めします。

于 2008-12-06T19:42:21.537 に答える
2

PHP5 はオーバーロードされたコンストラクターを許可しません。

または、関数を使用して設定するか、このトリックを使用することもできます (EE にあります):

function __construct ($var1, $var2 = null)
{
   if (isset($var2))
   {
      //Do one thing
   }
   else
   {
      //Do another
   }
}
于 2008-12-06T19:32:26.703 に答える
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;
}

清潔さのために、私は2番目のものを好みます。

于 2008-12-06T19:42:51.487 に答える
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'
于 2008-12-10T17:02:00.967 に答える