Очень часто на примерах и прототипах приходится разбирать какую-то задачу которая может произойти в боевой ситуации при разборе чужого кода. Ситуации бывают разные и сложность кода достаточно объёмная. Ладно если код большой, так он может быть и вовсе не читабельным который может превратиться в полный #говнокод.
Изучая различные ошибки с которыми придётся столкнутся в будущем или изучая определённую тему я разбирался с трейтами(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