Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
php包装器类中的instanceof错误_Php_Oop - Fatal编程技术网

php包装器类中的instanceof错误

php包装器类中的instanceof错误,php,oop,Php,Oop,我开始为预定义的php包编写包装器类。以下是课程: class phpclass1 :: ping() :: __construct(array $options) :: clear() :: addDoc(phpclass2 $string) ... class phpclass2 :: __construct() :: update() ... 以下是我为上述两个类编写的包装器类: class wrapper1 { priva

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

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
extend
phpclass2
来解决此问题。另请参见@nickydemayer:I已将我的代码编辑为
extend
wrapper2
类扩展为
phpclass2
。但是,它仍然给出一个错误:
phpclass1::addDoc():wrapper2无效。
您仍然将错误的对象传递到$this->conn->addDoc()。如果是phpclass2对象,则传递的是wrapper2对象。添加新公共方法的解决方案非常简单,为什么不实现它呢?我已将代码编辑为
wrapper2
类扩展为
phpclass2
。但是,它仍然给出了一个错误:
phpclass1::addDoc():wrapper2无效。
非常感谢。它可以工作,尽管它会为
析构函数
警告:phpclass2::\uu destruct():
抛出一个错误,但有没有其他方法实现包装类?根据您对它们的看法,您可以将许多接口与包装类结合使用,但就我所知,我会和你做的差不多。至于析构函数警告,它的完全错误是什么?正如其他答案所指出的,您也可以通过创建
phpclass1
phpclass2
的子类来使用继承,尽管这在本例中可能没有多大意义。