22

class temp関数(実際には別のクラスのコンストラクター)には、引数としてのオブジェクトが必要です。そこで、関数の引数として定義interface itempして含めます。これは問題ありません。関数にオブジェクトをitemp $obj渡す必要があります。しかし今、私はこの引数class tempにデフォルト値を設定したいと思います。itemp $objどうすればこれを達成できますか?

それとも不可能ですか?

明確にするためのテストコード:

interface itemp { public function get(); }

class temp implements itemp
{
    private $_var;
    public function __construct($var = NULL) { $this->_var = $var; }
    public function get() { return $this->_var ; }
}
$defaultTempObj = new temp('Default');

function func1(itemp $obj)
{
    print "Got: " . $obj->get() . " as argument.\n";
}

function func2(itemp $obj = $defaultTempObj) //error : unexpected T_VARIABLE
{
    print "Got: " . $obj->get() . " as argument.\n";
}

$tempObj = new temp('foo');

func1($defaultTempObj); // Got: Default as argument.
func1($tempObj); // Got : foo as argument.
func1(); // "error : argument 1 must implement interface itemp (should print Default)"
//func2(); // Could not test as I can't define it
4

5 に答える 5

31

できません。しかし、あなたは簡単にそれを行うことができます:

function func2(itemp $obj = null)
    if ($obj === null) {
        $obj = new temp('Default');
    }
    // ....
}
于 2011-08-15T12:41:30.313 に答える
4

Arnaud Le Blanc の回答で考えられる問題は、場合によっては、指定されたパラメーターとして許可したい場合があることですNULL。たとえば、以下を別の方法で処理したい場合があります。

func2();
func2(NULL);

もしそうなら、より良い解決策は次のとおりです。

function func2(itemp $obj = NULL)
{

  if (0 === func_num_args())
  {
    $obj = new temp('Default');
  }

  // ...

}
于 2014-12-04T12:01:54.323 に答える
0

この場合、私の小さなライブラリValueResolverを使用できます。たとえば、次のようになります。

function func2(itemp $obj = null)
    $obj = ValueResolver::resolve($obj, new temp('Default'));
    // ....
}

名前空間を使用することを忘れないでくださいuse LapaLabs\ValueResolver\Resolver\ValueResolver;

たとえば、変数の値が である必要がある場合など、型キャストする機能もあるintegerので、これを使用します。

$id = ValueResolver::toInteger('6 apples', 1); // returns 6
$id = ValueResolver::toInteger('There are no apples', 1); // returns 1 (used default value)

その他の例については、ドキュメントを確認してください

于 2015-07-09T11:07:26.890 に答える