Могу ли я расширить класс, используя более 1 класса в PHP? - PullRequest
130 голосов
/ 10 декабря 2008

Если у меня есть несколько классов с функциями, которые мне нужны, но я хочу сохранить их отдельно для организации, могу ли я расширить класс, чтобы иметь оба?

т.е. class a extends b extends c

edit: я знаю, как расширять классы по одному, но я ищу способ мгновенного расширения класса, используя несколько базовых классов - AFAIK, вы не можете сделать это в PHP, но должны быть способы обойти это без обращения к class c extends b, class b extends a

Ответы [ 19 ]

1 голос
/ 24 марта 2016

Вы можете сделать это, используя черты в PHP, объявленные в PHP 5.4

Вот краткое руководство для вас, http://culttt.com/2014/06/25/php-traits/

1 голос
/ 01 февраля 2012

Я только что решил мою проблему «множественного наследования» с:

class Session {
    public $username;
}

class MyServiceResponsetype {
    protected $only_avaliable_in_response;
}

class SessionResponse extends MyServiceResponsetype {
    /** has shared $only_avaliable_in_response */

    public $session;

    public function __construct(Session $session) {
      $this->session = $session;
    }

}

Таким образом, у меня есть возможность манипулировать сеансом внутри SessionResponse, который расширяет MyServiceResponsetype, по-прежнему способный обрабатывать сеанс самостоятельно.

0 голосов
/ 23 декабря 2013

Если вы хотите проверить, является ли функция общедоступной, см. Эту тему: https://stackoverflow.com/a/4160928/2226755

И использовать метод call_user_func_array (...) для множества аргументов или нет.

Как это:

class B {
    public function method_from_b($s) {
        echo $s;
    }
}

class C {
    public function method_from_c($l, $l1, $l2) {
        echo $l.$l1.$l2;
    }
}

class A extends B {
    private $c;

    public function __construct() {
        $this->c = new C;
    }

    public function __call($method, $args) {
        if (method_exists($this->c, $method)) {
            $reflection = new ReflectionMethod($this->c, $method);
            if (!$reflection->isPublic()) {
                throw new RuntimeException("Call to not public method ".get_class($this)."::$method()");
            }

            return call_user_func_array(array($this->c, $method), $args);
        } else {
            throw new RuntimeException("Call to undefined method ".get_class($this)."::$method()");
        }
    }
}


$a = new A;
$a->method_from_b("abc");
$a->method_from_c("d", "e", "f");
0 голосов
/ 25 января 2009

Не зная точно, чего вы пытаетесь достичь, я бы посоветовал изучить возможность изменения дизайна вашего приложения, чтобы использовать композицию, а не наследование.

0 голосов
/ 10 декабря 2008

PHP не разрешает множественное наследование, но вы можете сделать это с помощью реализации нескольких интерфейсов. Если реализация "тяжелая", предоставьте скелетную реализацию для каждого интерфейса в отдельном классе. Затем вы можете делегировать все классы интерфейса этим реализациям скелета через удержание объекта .

0 голосов
/ 06 мая 2017

Одной из проблем PHP как языка программирования является тот факт, что вы можете иметь только одно наследование. Это означает, что класс может наследоваться только от одного другого класса.

Однако в большинстве случаев было бы полезно наследовать от нескольких классов. Например, может быть желательно наследовать методы от пары разных классов, чтобы предотвратить дублирование кода.

Эта проблема может привести к тому, что у класса длинная семейная история наследования, которая часто не имеет смысла.

В PHP 5.4 была добавлена ​​новая функция языка, известная как Черты. Черта похожа на Mixin в том, что она позволяет вам смешивать классы черт в существующий класс. Это означает, что вы можете уменьшить дублирование кода и получить преимущества, избегая проблем множественного наследования.

1010 * Черты характера *

0 голосов
/ 01 мая 2011

Всегда хорошая идея сделать родительский класс с функциями ... то есть добавить все эти функции в родительский.

И "переместить" все классы, которые используют это иерархически вниз. Мне нужно - переписать функции, которые являются конкретными.

0 голосов
/ 14 июня 2018

класс A расширяет B {}

класс B расширяет C {}

Тогда A расширил и B, и C

0 голосов
/ 10 декабря 2008

PHP пока не поддерживает наследование нескольких классов, однако поддерживает наследование нескольких интерфейсов.

См. http://www.hudzilla.org/php/6_17_0.php для некоторых примеров.

...