【发布时间】:2011-09-27 18:13:59
【问题描述】:
我有一个有几个子类的类,但是我现在要添加另一个类,我也想成为父类的子类,但是我也想利用其他子类中的许多功能.
我曾想过将各自的函数从另一个子类移到父类,但认为这并不是真正需要的,因为只有这两个子类会使用它们,所以希望我可以从主父类和现有子类之一扩展。
【问题讨论】:
我有一个有几个子类的类,但是我现在要添加另一个类,我也想成为父类的子类,但是我也想利用其他子类中的许多功能.
我曾想过将各自的函数从另一个子类移到父类,但认为这并不是真正需要的,因为只有这两个子类会使用它们,所以希望我可以从主父类和现有子类之一扩展。
【问题讨论】:
没有 php 是单继承语言。如果可以的话,您可以在 php 5.4 中查找即将推出的功能,即特征。
【讨论】:
作为是/否的答案,我可以说不。
您不能从 php.ini 中的多个类扩展。但你可以改用interface。
【讨论】:
您可以扩展子类以继承其父类和子类的功能,我认为这是您想要做的。
class Parent
{
protected function _doStuff();
}
class Child extends Parent
{
protected function _doChildStuff();
}
class Your_Class extends Child
{
// Access to all of Parent and all of Child's members
}
// Your_Class has access to both _doStuff() and _doChildStuff() by inheritance
【讨论】:
extends A, B或其他东西)
Your_Class 你可以像往常一样使用$this->method() 调用它们...每个protected 和public 成员都将被继承。 Child 是 Your_Class 的父级,但通过多态性,Parent 的类型提示也将接受 Your_Class 对象。 我在代码示例中添加了一些细节以表明这一点
您可以通过向后思考来做到这一点,但这取决于具体情况。如果您想将您的类分开,除非您向我们提供更多信息,否则没有人可以为您提供有关如何构造对象和继承的好答案。还要记住,过于担心类结构的正确性是小型项目的负担,您最好将方法移过来并完成它,稍后再了解有关类的更多信息。
【讨论】:
正如@morphles 所说,此功能将在 php 5.4 中作为特征(如其他语言中的 mixins)提供。但是,如果确实需要,您可以使用这样的解决方法:
// your class #1
class A {
function smthA() { echo 'A'; }
}
// your class #2
class B {
function smthB() { echo 'B'; }
}
// composer class
class ComposeAB {
// list of implemented classes
private $classes = array('A', 'B');
// storage for objects of classes
private $objects = array();
// creating all objects
function __construct() {
foreach($this->classes as $className)
$this->objects[] = new $className;
}
// looking for class method in all the objects
function __call($method, $args) {
foreach($this->objects as $object) {
$callback = array($object, $method);
if(is_callable($callback))
return call_user_func_array($callback, $args);
}
}
}
$ab = new ComposeAB;
$ab->smthA();
$ab->smthB();
【讨论】: