На абстрактных примерах с буквами сложно обсуждать, но я попробую.
class A у нас не абстрактный, соответственно, у нас есть инстансы A, и есть код, работающий с инстансами A (аргументы методов требуют A $a).
Дальше где-то нам потребовалось сделать x(), который вычисляется из публичных методов A. В твоем примере получается, что это можно сделать только с instanceof B. Соответственно, рано или поздно мы либо придем к коду вида if ($a instanceof B), либо начнем извращения вида B::constructFromA(A $a). Никаких объективных причин для этого нет, и если бы мы написали
PHP:
class B implements D {
public function __construct(A $a) {..}
public function x() {
return $this->a->a($this->a->b()) +$this->a->c();
}
}
проблем бы не возникло.
есть прикольная библиотека
...и эта библилотека (либо иной сторонний код, зависящий от этой библиотеки) наверняка ожидает и возвращает (либо передает дальше по цепочке) instanceof A, теряя тип B. И опять где-то вылезет instanceof.
Заметь, кстати, что в варианте с композицией проблем не будет, даже если A - abstract.
Плюс, с библиотекой ты таким образом завязываешься на ее реализацию, на ее, возможно, не самый удобный API, и, в том числе, если решишь сменить эту библиотеку на другую, будешь вынужден для замены реализовать все публичные методы старой библиотеки - даже те, которые тебе нафиг не нужны. Вот недавно обсуждали про наследование от PDO.
