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();
}

如果我将所有这些复制到一个文件中并消除命名空间,我可以让上面的代码工作。基本上:

  • 如果我需要 PhotoTable 中的属性,我可以传递列表,因为它扩展了属性。
  • 如果我需要 PhotoInterface,我可以传递列表,因为它实现了这个接口。

但是当我在名称空间 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 回答