Can you extend two classes in one class? [duplicat

2019-04-21 09:09发布

问题:

Possible Duplicate:
Can I extend a class using more than 1 class in PHP?

I have a class that has several child classes, however I am now adding another class which I also want to be a child of the parent, however I would also like to utilize many of the functions from one of the other child classes.

I've thought of just moving the respective functions from the other child class to the parent, however didn't think this was really needed as it would only be these two child classes that make use of them so was hoping that I could extend from the main parent class and from one of the existing child classes.

回答1:

You can extend the child class to inherit both its parent and the child's functions, which I think is what you are trying to do.

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


回答2:

As said @morphles, this feature will be available as traits (like mixins in other languages) in php 5.4. However, if it's really needed, you can use such workaround:

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


回答3:

No php is single inheritance language. If you can you can lookup upcoming feature in php 5.4, that is traits.



回答4:

As a yes/no answer i can say no. You can't extend from multiple classes in php. but you can use interface instead.



回答5:

You can do this by thinking backwards, however it depends on the situation. If you would like to keep your classes separate, nobody can give you a good answer of how to structure your objects and inheritance unless you give us more information. Also keep in mind that getting too worried about getting class structure right is a burden in small projects and you may as well just move the methods over and be done with it and learn more about classes later.



标签: php oop extends