Обычно делегирование дает больше гибкости чем наследование
class CommonClass {
public function foo() {/*...*/}
public function bar() {/*...*/}
}
class ConcreteClass1 extends CommonClass {
public function doSomething1() {/*...*/}
public function doSomething2() {/*...*/}
}
class ConcreteClass2 {
ConcreteClass1 concreteClass1 = new ConcreteClass1();
public function doSomething1() {concreteClass1.doSomething1()}
public function doSomething2() {concreteClass1.doSomething2()}
public function doSomething3() {/*...*/}
}
Попробуйте рассмотреть шаблон Стратегия.