PHP设计模式-继承与适配器模式?

PHP设计模式-继承与适配器模式?,php,inheritance,design-patterns,adapter,extends,Php,Inheritance,Design Patterns,Adapter,Extends,我对适配器模式的概念有点困惑。我发现适配器类与我通常编写的扩展类非常相似。那么,它们之间的差异究竟是什么呢 例如(这是一个例子) SimpleBook.php class SimpleBook { private $author; private $title; function __construct($author_in, $title_in) { $this->author = $author_in; $this->tit

我对适配器模式的概念有点困惑。我发现适配器类与我通常编写的扩展类非常相似。那么,它们之间的差异究竟是什么呢

例如(这是一个例子)

SimpleBook.php

class SimpleBook {


    private $author;
    private $title;


    function __construct($author_in, $title_in) {
      $this->author = $author_in;
      $this->title  = $title_in;
    }


    function getAuthor() {return $this->author;}


    function getTitle() {return $this->title;}


  }
BookAdapter.php

include_once('SimpleBook.php');

  class BookAdapter {


    private $book;


    function __construct(SimpleBook $book_in) {
      $this->book = $book_in;
    }


    function getAuthorAndTitle() {
      return $this->book->getTitle() . ' by ' . $this->book->getAuthor();
    }


  }
BookExtension.php

include_once('SimpleBook.php');

      class BookExtension extends SimpleBook{

        function getAuthorAndTitle() {
          return $this->getTitle() . ' by ' . $this->getAuthor();
        }


      }

第二种解决方案似乎简单得多。那么,它(以及其他继承类)是否被视为适配器类呢?

区别在于这些类如何与多态性一起使用

如果使用继承,任何需要
SimpleBook
的函数也将接受
BookExtension
,或任何其他扩展
SimpleBook
的类。例如,如果您有:

function PigLatinTitle(SimpleBook $b) {
    return PigLatin($b->getTitle());
}
您可以在
BookExtension
上调用此函数,因为它继承了
SimpleBook::getTitle()
方法

请注意,它不会以另一种方式工作:期望
BookExtension
的函数不会与
SimpleBook
一起工作。例如,如果函数调用
getAuthorAndTitle()

如果使用适配器,则这两个类是独立的。期望使用
SimpleBook
的函数将不接受
BookAdapter
,反之亦然。无法在
BookAdapter
上调用
PiglatitTitle()
,因为没有
BookAdapter::getTitle()
方法

通过将
\u call()
魔术方法添加到
BookAdapter
,然后在
$this->book
上重新调用该方法,可以使适配器像继承一样工作:

public function __call($name, $arguments) {
    return call_user_func_array(array($this->book, $name), $arguments);
}

您可以阅读这个关于适配器的有趣问题。很可能是一个包含内部类和外部类的包装器模式:。

谢谢您的回答。我对
有点困惑,如果您使用继承,任何期望SimpleBook的函数也会接受BookExtension,或者任何其他扩展SimpleBook的类。
我认为在继承中,父类对其子类一无所知。因此,当我单独使用父类时,我没有使用它的子类,对吗?父类不需要知道关于子类的任何信息,它是自动的。它们继承父对象的方法。确定。因此,如果我
expect
SimpleBook only,我将如何
也接受
BookExtension?它们实际上是独立的(cos BookExtension依赖于SimpleBook,就像BookAdapter依赖于SimpleBook一样)。参见我添加的示例。这两个函数中都没有,它只是一个普通函数。