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

はインスタンス$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 の署名を変更します。wrapper2toの内部で次のpublicように使用します

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

PHP でのタイプヒンティングの詳細については、 php タイプヒンティングのドキュメントページをご覧ください。

考慮すべきもう1つのことは、ヒントを入力する必要がある/したいということであり、すでに詳細に議論されているため、賛成/反対の議論をするのではなく、単に質問したいだけの質問です.

答えが「はい」の場合は、型ヒントを使用する適切な方法と理由について説明している次のリンクを読むことをお勧めします。

これが役立つことを願っています

于 2013-08-05T14:24:14.487 に答える
0

phpclass1::addDocのオブジェクトのみを取得するようにヒントされたタイプですphpclass2。あなたのwrapper1::addメソッドはタイプのオブジェクトを取り、それを クラスに基づいてにwrapper2渡します。これはのインスタンスではないため、矛盾しています。phpclass1::addDocwrapper2phpclass2

タイプヒントを変更するか、wrapper2クラスphpclass2がラップまたは拡張しているオブジェクトを提供しwrapper2て、それがインスタンスになるようにする必要がありますphpclass2

于 2013-08-05T14:11:30.267 に答える