web-dev-qa-db-ja.com

型ヒント:デフォルトのパラメーター

PHP 5型ヒント

PHP 5はタイプヒントを導入します。関数はパラメータをオブジェクトにすることができます(指定することにより関数プロトタイプのクラスの名前)またはarrayssince PHP 5.1 =)。ただし、NULLがデフォルトのパラメーター値として使用されている場合は、以降の呼び出しの引数として許可されます。

上記の次の抜粋:

NULLがデフォルトのパラメータ値として使用される場合、それは以降の呼び出しの引数として許可されます。

上記の意味:

タイプヒンティングでデフォルトパラメータを使用する場合、デフォルト値としてNULLのみを使用できます。

i.e。code1のコードが間違っていて、次のようになります。

致命的なエラー:クラスタイプのヒントを持つパラメーターのデフォルト値は、NULLのみです

code1:

 function setName ( string $name = "happ") {
  ...
  }

Code2のコードが正しい場合:

code2:

 function setName ( string $name = NULL) {
  ...
  }

なぜこの制約がPHPで割り当てられているのですか?

43
ThinkingMonkey

文字列をタイプヒントすることはできません。オブジェクトと配列のみをタイプヒントすることができるため、これは正しくありません。

function setName ( string $name = "happ") {

(ここでコンパイル時エラーが発生しないのは、PHPが "string"をクラスの名前として解釈しているためです。)

ドキュメントの文言は、これを行う場合:

function foo(Foo $arg) {

その場合、foo()に渡す引数はオブジェクトFooのインスタンスでなければなりません。しかし、これを行う場合:

function foo(Foo $arg = null) {

Foo()に渡される引数は、オブジェクトFooのインスタンス、またはnullのいずれかです。また、これを行う場合:

function foo(array $foo = array(1, 2, 3))

その後、foo(null)を呼び出すことはできません。この機能が必要な場合は、次のようなことができます。

function foo(array $foo = null) {
    if ($foo === null) {
        $foo = array(1, 2, 3);
    }

[Edit 1] PHP 5.4では、callableと入力できます:

function foo(callable $callback) {
    call_user_func($callback);
}

[Edit 2] PHP 7.0では、boolfloatint、およびstringと入力できます。これにより、質問内のコードが有効な構文になりますPHP 7.1以降では、iterableと入力できます。

77
Alex Howansky

型宣言 (PHP 5)の型ヒントとも呼ばれます)string型のPHP 7。

有効なタイプ は次のとおりです。

  • クラス/インターフェース名(> = PHP 5.0.0);
  • self(> = PHP 5.0.0);
  • array(> = PHP 5.1.0);
  • callable(> = PHP 5.4.0);
  • boolfloatintstring(> = PHP 7.0.0);
  • iterable-配列またはTraversableのインスタンス(> = PHP 7.1.0)。
4
kenorb

これは、コンパイル時間と実行時の値の問題です。コンパイル時には、リテラル値(文字列、数値、ブール値、およびNULL)のみが許可されます。 PHPプロセッサは現時点ではすべての可能なクラスについて知ることができないため、関数の引数にオブジェクトのインスタンスを作成することはできません。

抜粋から私が期待しているのは、通常、タイプヒント付き関数にNULLを渡すと、例外/エラーがスローされることです。デフォルトをNULLに設定すると、NULLが渡されてもこの例外はスローされません。私はそれをテストしていません、ちょうど私が期待するものです。

1
Chris