メソッド引数でクラスヒントを使用している状況で、インターフェイスまたは子クラスを使用しようとしていますが、次の警告が表示され続けます。
$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 環境の別のファイルに本質的に同じクラスがあると、この奇妙なエラーが発生します。
私が考慮する必要がある名前空間環境に余分な複雑さがありますか、それとも本当に基本的なものが欠けていますか?