0

メソッド引数でクラスヒントを使用している状況で、インターフェイスまたは子クラスを使用しようとしていますが、次の警告が表示され続けます。

$print_r(class_parents($listing));
$propertyTable -> getPhotos($listing);

Array ( [Tools\Object\Property] => Tools\Object\Property ) 

Catchable fatal error: Argument 1 passed to Tools\Db\PhotoTable::getPhotos() must be an
instance of Tools\Db\Property, instance of Tools\Object\Listing given, called in ... 
and defined in ...

テストされたリストがプロパティを拡張するときにわかるように、これは奇妙です (以下を参照)。このエラーが発生するのはなぜですか?

私は非常に基本的なテスト ケースを設定し、型ヒントが子クラス、またはそのクラスがインターフェイスである必要なクラスを実装するクラスを受け入れる必要があることを理解しました。ただし、名前空間の Zend Framework 2 環境では、これを機能させることができません。

さまざまなクラスの私のコードは次のようになります。

namespace Tools\Db;

class PhotoTable
{  
   public function getPhotos(Property $propertyObject )
   {  
    //code goes here    
   }
}

 namespace Tools\Object;
 use Tools\Object\PhotoInterface as PhotoInterface;

 class property //implements photoInterface
 {
    public function getUrl(){ code goes here}
    public function getPhotos(){ code goes here}
  }//end class

 use Tools\Object\PhotoInterface as PhotoInterface;

class Listing extends Property implements PhotoInterface
{
//code goes here
}

namespace Tools\Object;

interface PhotoInterface 
{
   public function getUrl();
   public function getPhotos();
}

これをすべて 1 つのファイルにコピーし、名前空間を削除すると、上記のコードを動作させることができます。基本的:

  • PhotoTable でプロパティが必要な場合は、プロパティを拡張する Listing を渡すことができます。
  • PhotoInterface が必要な場合は、このインターフェイスを実装する Listing を渡すことができます。

しかし、名前空間の Zend Framework 2 環境の別のファイルに本質的に同じクラスがあると、この奇妙なエラーが発生します。

私が考慮する必要がある名前空間環境に余分な複雑さがありますか、それとも本当に基本的なものが欠けていますか?

4

1 に答える 1

0

この問題は、スクリプトの先頭に含まれる名前空間ファイルに関係しているようです。具体的には、渡されるクラスだけでなく、指定された親クラスまたは型ヒントで指定されている場合はインターフェイス クラスも含める必要があるようです。

私のクラスタイプのヒントが「プロパティ」クラスが必要であることを示唆している場合の例を挙げると、「リスト」オブジェクトを送信する場合、次のようにヘッダーにプロパティを含める必要があるようです:

namespace Tools\Object;

use Tools\Object\Property;  //the parent class
use Tools\Object\Listing;  //the child class

これで致命的なエラーは解消されますが、PHP が自動的にクラスを判別できないのは奇妙に思えます。名前空間環境の複雑さと関係があると思います。

于 2012-12-08T17:29:20.477 に答える