Learning черти

Безплатен превод от английски статии програмист на място кодекс.

PHP придобива всички нови функции и постепенно поправи предишните грешки. В PHP 5.4 един от най-важните нововъведения са характеристики (черти). PHP по всяко време поддържат само единично наследяване на класове, т.е. Всеки клас може да има само един родител, който на практика понякога е лошо за кода за организация и може да доведе до дублиране.

Езици като C ++ или Python решаване на този проблем, като позволява на наследство от различни класове (multinasledovaniya). Ruby използва за тази примес (Mixins). Независимо от проблема, една техника е една и съща. Черти са друг начин да се реши този проблем, и се използват, например, в езици като Perl, Scala.

PHP, и множествено наследяване

Основната причина, че PHP nebylo множествено наследяване е "проблем ромб" (диамант проблем), което се случва в определен multinasledovani. "Проблемът е, ромб" - това е двусмислието, което възниква, когато multinasledovaniii.

Ето един пример. Класове В и С наследи от клас А и клас D наследява odnovmeremenno Б и В. клас А е метод, който ще бъде заменен в B, така и с клас, но това не е засегнато в класа D. Кой метод да наследите от клас D?

Да приемем, че PHP е множествено наследяване (всъщност не), а след това на "проблема на ромба" в нашите примери, ще бъде нещо като това: клас няма да знаете кой метод Roar () наследи.

Това е, всъщност, проблемът multinasledovaniya и PHP, за щастие (или може би обратното), поддържа само единичен наследство и не може да създаде такава грешка. Но с PHP 5.4 версия, ние все още ще бъде в състояние да прилага такава функционалност.

Удобства черти

Черти - механизъм за повторно използване код в единични езици наследството (като PHP). Черти облекчаване на разработчика от някои единични ограничения върху наследството, което позволява използването на набор от независими методи в различни класове. php.net.

Най-лесният начин да се разбере черти: мисли за тях и връзките с методите на изпълнение. Както казахме, това е част от един наследство ООП в PHP продължение на много години, и много фирми бяха разочаровани, че част, когато се опитва да напише чист код за голям проект.

С черти можем да използваме и функционалността на другите класове (прибл. Trans. В действителност, няма класове, а именно черти) и по този начин не трябва да ги наследят. Това звучи като multinasledovanie, но всъщност черти са по-скоро като "хоризонтална повторно използване на код", че докато наследство е "вертикално повторно използване на код".

Както казахме по-рано, черти като абстрактен клас, например, не може да се създаде обект директно от чертата. Нека разгледаме един пример:

Ако смятате, че бихте могли да направите същата единна наследство чрез създаване на класа Cat, които наследява от животните, а след това да наследи от Tiger Cat, опитайте следното:

Cool, нали? Опитайте се да направите същото, без да multinasledovaniya.

Най-добър в черта - това е тяхното структуриране. Котка и BigCat имат много общи черти (същата котка, но по-голям), но това е много удобно да се разделят на методи за различна черта и да ги използвате, както е необходимо. В действителност, ние може да отиде още по-далеч: