2016-07-07 8 views
0

これは簡単な質問ですが、私はこの点についてはわかりませんので、この質問は役に立ちそうです。 PHPでクラスにメソッドに渡されるパラメータに準拠するPHPクラス - 型ヒント

、私はこの構造を見てきました:

Class Class_A{ 
    ... 
    function sampleMethod(Class_B $a){ 
     .. 
    } 
} 
$a = /* some value */; 
$obj = new Class_A; 
$return = $obj->sampleMethod($a); 

私は理解していない部分がメソッドsampleMethod()への引数にClass_B$aを前置されます。私が持っている

質問は以下のとおりです。

  • この方法のための正しい用語は何ですか? (だから私は研究することができます)
  • に変数を宣言していますか? Class_B?
  • $aは既にClass_Bのオブジェクトでなければなりませんか?可変タイプ$aがClass_Bと互換性がない条件がありますか?

- 編集:私は求めていた用語がタイプヒンティングだった -

+3

あなたはその構文について確信していますか?あなたは[タイプヒント](http://php.net/manual/en/functions.arguments.php#functions.arguments.type-declaration)を実行しようとしているようですが、これは実行時ではなくメソッド宣言で行われます。違いは、以下のようなメソッドを定義するときです。 'class A {public function B(C $ c){...}}'メソッド 'B'は' C '型の1つの引数で定義されます。 –

+0

私は将来私のコメントを編集しました使用する - これはタイプヒントです、ありがとう –

答えて

1

(それが今で型宣言と命名されたとしても、実際に)あなたがについてtype hintingを話しているように見えます。あなたの質問にお答えします:

  1. タイプ宣言またはタイプヒント。あなたが基本的にこの議論が必要なデータのタイプを示唆しているからです。

  2. 指定された引数は、スカラー型(array、string、int ...などのデータ型で構築されたもの)または指定されたクラスまたはインタフェースのインスタンスである必要があると宣言しています。

  3. はい、特定の型またはその型を実装/拡張するクラスである必要があります。

    <?php 
    class C {} 
    class D extends C {} 
    
    // This doesn't extend C. 
    class E {} 
    
    function f(C $c) { 
        echo get_class($c)."\n"; 
    } 
    
    f(new C); //output: C 
    f(new D); //output: D 
    f(new E); //output: fatal error argument must be an instance of C 
    

    あなたが見ることができるように、宣言に必要なクラスCパッシングに渡される:ここで

は、私はこのことを示すのは良い仕事をしないと考えることは、上記リンクマニュアルの例でありますCのインスタンスでは、期待どおりに動作します。 Dに合格するのは、DCに拡張されているためです。Dに含まれる可能性のある追加のメソッド/プロパティでも、Cの有効なインスタンスとみなされます。 Eに合格すると、何らかの形でCに関連しないため、致命的なエラーで失敗します。

関連する問題