48

PHP5タイプヒント

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

上記からの次の抜粋:

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

上記の意味は次のとおりです。

デフォルトパラメータをタイプヒントとともに使用する場合はNULL、デフォルト値としてのみ持つことができます。

つまり、code1のコードが間違っており、次のようになります。

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

code1:

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

code2のコードが正しいのに対し:

code2:

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

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

4

3 に答える 3

83

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

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

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

ドキュメントの文言は、これを行うと次のことを意味します。

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以降、、、、、およびboolfloat入力できます。これにより、質問のコードが有効な構文になります。PHP 7.1以降、タイプヒントを使用できます。intstringiterable

于 2011-12-15T16:07:48.437 に答える
6

型の型宣言(PHP 5では型ヒントとも呼ばれます)は、stringPHP7でサポートされています。

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

  • クラス/インターフェース名(> = PHP 5.0.0);
  • self(> = PHP 5.0.0);
  • array(> = PHP 5.1.0);
  • callable(> = PHP 5.4.0);
  • bool、、、float( > = PHP 7.0.0 intstring;
  • iterable -Traversableの配列またはインスタンス(> = PHP 7.1.0)。
于 2018-01-15T16:09:25.787 に答える
1

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

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

于 2011-12-15T16:11:46.763 に答える