10

我开始为预定义的 php 包编写一个包装类。以下是课程:

class phpclass1
    :: ping()
    :: __construct(array $options)
    :: clear() 
    :: addDoc(phpclass2 $string)

...

class phpclass2 
    :: __construct()
    :: update()
...

以下是我为上述 2 个类编写的包装类:

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正常。它给出了一个错误:Argument 1 passed to phpclass1::addDoc() must be an instance of phpclass2, instance of wrapper2 given

我错过了什么?我尝试了很多东西,但在这里完全迷失了。

4

4 回答 4

2

问题

您正在键入提示一种wrapper1方法来接受wrapper2所有好的类型。在wrapper1您声明的方法内

public function add(wrapper2 $document) {
        return $this->conn->addDoc($document);
    }

where$conn被定义为一个phpclass1实例。当你打电话时问题就出现了

return $this->conn->addDoc($document);

这期望一种类型,phpclass2但 $document 实际上是一种类型,wrapper2因为我们认为它您不能编辑,phpclass1或者phpclass2您需要修改您的包装类。

解决方案

解决方案 1

要么改变wrapper2 to be

class wrapper2 {
    private $doc;
    public function __construct() {
        $this->doc = new phpclass2();
    }
    public function GetDoc()
    {
      return $this->doc;
    }
}

并使用如下

$conn->add($doc->GetDoc());

解决方案 2

更改 $doc 的签名;在wrapper2topublic和使用如下

$conn->add($doc->doc);

有关 php 中 typehinting 的更多信息,请查看它的文档页面 php typehinting

要考虑的另一件事是您是否需要/想要输入提示,而不是提出支持/反对的论据,因为它已经被详细讨论过,只是您可能想问的一个问题。

如果答案是肯定的,您可能需要阅读以下链接,其中讨论了使用类型提示的好方法和理由

我希望这有帮助

于 2013-08-05T14:24:14.487 回答
2

你已经定义了

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());
}
于 2013-07-25T10:41:04.480 回答
0

phpclass1::addDoc的 is 类型提示仅采用phpclass2. 您的wrapper1::add方法采用类型的对象,wrapper2然后将其传递给phpclass1::addDoc 基于您的类,这是不一致的,因为wrapper2它不是phpclass2.

您需要更改类型提示或允许wrapper2该类提供phpclass2它正在包装或扩展的对象,wrapper2以便它是phpclass2

于 2013-08-05T14:11:30.267 回答
0

更改类型提示public function add(wrapper2 $document)是问题所在public function add($document)

于 2013-08-08T14:26:05.063 回答