php包装器类中的instanceof错误
我开始为预定义的php包编写包装器类。以下是课程:php包装器类中的instanceof错误,php,oop,Php,Oop,我开始为预定义的php包编写包装器类。以下是课程: class phpclass1 :: ping() :: __construct(array $options) :: clear() :: addDoc(phpclass2 $string) ... class phpclass2 :: __construct() :: update() ... 以下是我为上述两个类编写的包装器类: class wrapper1 { priva
class phpclass1
:: ping()
:: __construct(array $options)
:: clear()
:: addDoc(phpclass2 $string)
...
class phpclass2
:: __construct()
:: update()
...
以下是我为上述两个类编写的包装器类:
class wrapper1 {
private $conn;
public function __construct(phpclass1 $object) {
$this->conn = $object;
}
public function add(wrapper2 $document) {
return $this->conn->addDoc($document);
}
}
class wrapper2 extends phpclass2 {
private $doc;
public function __construct() {
$this->doc = new phpclass2();
}
}
Here's how I'm using them:
$options = array (...);
$object = new phpclass1($options);
$conn = new wrapper1($object);
$doc = new wrapper2();
....
....
$conn->add($doc);
在我使用add
功能之前,一切都正常。它给出了一个错误:传递给phpclass1::addDoc()的参数1必须是phpclass2的实例,给定的wrapper2的实例
我错过了什么?我尝试了很多东西,但在这里完全失败了。您已经定义了
class phpclass1 :: addDoc(phpclass2 $string)
此方法期望参数是phpclass2的对象,但您正在传递
return $this->conn->addDoc($document);
通过
$conn->add($doc);
$doc是wrapper2的对象,而不是phpclass2
要修复此问题,请添加新的公共方法
wrapper2::getDoc()
public function add(wrapper2 $document) {
return $this->conn->addDoc($document->getDoc());
}
您的
phpclass1::addDoc
类型暗示仅获取phpclass2
的对象。您的wrapper1::add
方法获取类型为wrapper2
的对象,然后根据您的类将其传递给phpclass1::addDoc
,这是不一致的,因为wrapper2
不是phpclass2
的实例
您需要更改typehint或允许
wrapper2
类提供它正在包装或扩展wrapper2
的phpclass2
对象,以便它是问题的一个实例
您的类型暗示了一个wrapper1
方法来接受wrapper2
的类型。在您声明的wrapper1
方法中
public function add(wrapper2 $document) {
return $this->conn->addDoc($document);
}
其中,$conn
被定义为phpclass1
实例。问题就在你说的时候出现了
return $this->conn->addDoc($document);
它需要一种类型为phpclass2
,但$document实际上是一种类型为wrapper2
,我们认为您不能编辑phpclass1
或phpclass2
,您需要修改包装器类
解决方案
解决方案1
将wrapper2更改为
class wrapper2 {
private $doc;
public function __construct() {
$this->doc = new phpclass2();
}
public function GetDoc()
{
return $this->doc;
}
}
使用方法如下
$conn->add($doc->GetDoc());
$conn->add($doc->doc);
解决方案2
更改$doc的签名;在wrapper2
到public
的内部,并按如下方式使用
$conn->add($doc->GetDoc());
$conn->add($doc->doc);
有关php中类型提示的更多信息,请查看其文档页面
另一个要考虑的问题是,你需要/想要键入提示,而不是为已经辩论过的争论而提出反对意见,只是一个你可能想问的问题。
如果答案是肯定的,你可能想阅读下面关于使用类型暗示的好方法和理由的文章
我希望这有助于将公共函数添加(wrapper2$document)
更改为公共函数添加($document)
这就是问题所在。phpclass1::addDoc()
的参数类型暗示为phpclass2
,您正在传递它$document
,它是wrapper2
。除非wrapper2
扩展phpclass2
,否则类型提示将失败。@MichaelBerkowski:我尝试过,但出现了一些错误。(我猜我正在使用的php包可能不支持这样的实例复制/克隆)。所以我想知道是否还有其他方法。我们需要看看错误是什么。只要您不尝试重写final
或private
方法,您就应该能够扩展该类,以避免某些潜在的异常情况。您的问题(IMHO)的最大问题是您没有提供代码。我看到的另一个大问题是,你没有明确为什么你会有这个问题。你为什么问这个?具体原因是什么?您试图解决的具体问题是什么?您在问题中提到的预定义PHP包是什么,但没有进一步说明?您可能想阅读有关的内容。他是正确的,您传递了错误的类型,您也可以通过制作wrapper2
extendphpclass2
来解决此问题。另请参见@nickydemayer:I已将我的代码编辑为extend
将wrapper2
类扩展为phpclass2
。但是,它仍然给出一个错误:phpclass1::addDoc():wrapper2无效。
您仍然将错误的对象传递到$this->conn->addDoc()。如果是phpclass2对象,则传递的是wrapper2对象。添加新公共方法的解决方案非常简单,为什么不实现它呢?我已将代码编辑为将wrapper2
类扩展为phpclass2
。但是,它仍然给出了一个错误:phpclass1::addDoc():wrapper2无效。
非常感谢。它可以工作,尽管它会为析构函数
:警告:phpclass2::\uu destruct():
抛出一个错误,但有没有其他方法实现包装类?根据您对它们的看法,您可以将许多接口与包装类结合使用,但就我所知,我会和你做的差不多。至于析构函数警告,它的完全错误是什么?正如其他答案所指出的,您也可以通过创建phpclass1
和phpclass2
的子类来使用继承,尽管这在本例中可能没有多大意义。