你能在一个类中扩展两个类吗?

10
可能重复:
在PHP中我能使用多于一个类来扩展一个类吗?

我有一个类,有几个子类,但现在我想添加另一个类,我也希望它是父类的子类,但我还想利用另一个子类中的许多函数。

我曾考虑过将其他子类中的相应函数移动到父类中,但认为这并不是必要的,因为只有这两个子类会使用它们,所以希望我可以从主父类和现有子类之一继承。

5个回答

17

你可以扩展子类以继承其父类和子类的函数,我认为这就是你想要做的。

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或类似的语法)。 - alxbl
这正是我想要做的,但我认为它不会继承主父类的东西。在这种情况下,哪个类是父类?如何从非父类访问函数/方法? - Brett
Your_Class 中,您可以像往常一样使用 $this->method() 调用所有 protectedpublic 成员... 每个成员都将被继承。 ChildYour_Class 的父类,但通过多态性,指定为 Parent 的类型提示也会接受一个 Your_Class 对象。我添加了代码示例的一些详细信息以展示这一点 - alxbl

11

如@morphles所说,这个特性将在php 5.4中作为traits(类似于其他语言中的mixin)提供。但是,如果确实需要,你可以使用以下解决方法:

// 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();

如果您需要更改它以满足您的需求,请写信给我。不用客气。 - RReverser
如果ComposeAB需要实现一个指定A和B函数的接口,这个代码会起作用吗?想象一下,如果接口有smthA和smthB,ComposeAB实现了这样的接口,__call函数是否满足接口的要求? - CMCDragonkai
@CMCDragonkai 不是。https://bugs.php.net/bug.php?id=41162 - RReverser
@CMCDragonkai 但在新的PHP中,您可以使用traits来实现更好的多重继承。 - RReverser
啊,那我只需要重新声明所有的函数就可以了。 - CMCDragonkai

8

PHP不是单一继承语言。如果您想了解即将推出的 PHP 5.4 版本中的新功能,可以查找 traits 特性。


2
作为一个是非题,我的回答是不可以。 在php中,你不能从多个类中继承,但你可以使用interface来代替。

0
你可以通过反向思考来做到这一点,但这取决于情况。如果您想保持类的分离,除非您提供更多信息,否则没有人能给出如何构造您的对象和继承的好答案。同时请记住,在小型项目中过于担心类结构是否正确是一种负担,您可能会将方法移动并完成它,并在以后学习更多关于类的知识。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接