trait в php

By | May 17, 2015

Очень часто на примерах и прототипах приходится разбирать какую-то задачу которая может произойти в боевой ситуации при разборе чужого кода. Ситуации бывают разные и сложность кода достаточно объёмная. Ладно если код большой, так он может быть и вовсе не читабельным который может превратиться в полный #говнокод.

Изучая различные ошибки с которыми придётся столкнутся в будущем или изучая определённую тему я разбирался с трейтами(http://php.net/manual/ru/language.oop5.traits.php) (#trait). Тема достаточно обширная и интересная. Сам трейты появились в ветке #php5.4 Трейты позволяют повторно использовать код php что даёт достаточно большие возможности для php.

 

Самый просто пример трейтов:

 

Я решил его расширить и сделал сложный пример с наследованием а так же переопределением конфликтов.

Все методы у меня публичные но имеют одни и те-же имена что вызывает фатальную ошибку при неявном описании:

<?php

ini_set('error_reporting', E_ALL);
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);

trait C {
    public function g() {
        echo __METHOD__;
    }

} 
trait R {
    public function g() {
        echo __METHOD__;
    }

}

/**
 * parent Class::method 
 */
class B {
    use  C, R {
        R::g insteadof C;        
    }

    public function g() {
        echo __METHOD__;
        $this -> g();
    }
}
/**
 * node Class::method 
 */
class A extends B {
    use  R, C {
        C::g insteadof R;  
    }
    public function f() {
        echo __METHOD__;
        B::g();
    }

}

$a = new A;
$a -> f();

В итоге мы получим

A::fB::gC::g

 

Category: Uncategorized