Traits в РНР
Какво са traits?
Traits са сравнително нова концепция, въведена в PHP 5.4.0 (
https://en.wikipedia.org/wiki/Trait_(computer_programming)). Те позволяват преизползване на код (PHP скрипт) в
няколко независими класа, намиращи се в различни класови йерархии, като по този начин се намалява дублирането на
скрипта и се спазва DRY (Do not repeat yourself) принципът в програмирането.
Създаване на trait
Създаването на trait се осъществява с помощта на ключовата дума trait:
trait My_trait {
public function My_function () {
//... съдържание на функцията
}
}
Добавяне на trait към клас
Добавянето на trait към клас се осъществява с помощта на оператора use.
class My_class {
use My_trait;
}
Може би вече ви е направило впечатление, че и namespace, и trait се добавят към класа с ключовата дума use. Импортването им, обаче, се осъществява по различен начин: добавянето на namespaces, класове, интерфейси, функции и канстанти, се осъществява извън класовата дефиниция, а traits се импортват вътре в класовата дефиниция.
РНР интерпретаторът копира и пейства trait в дефиницията на класа по време на компилиране на файла. Ако някои методи и свойства не са дефинирани в trait, е необходимо да бъдат дефинирани в класа.
РНР интерпретаторът копира и пейства trait в дефиницията на класа по време на компилиране на файла. Ако някои методи и свойства не са дефинирани в trait, е необходимо да бъдат дефинирани в класа.
Промяна на видимостта на методите от trait
За да променим видимостта на методите от trait, ни е необходима ключовата дума as.
class My_class {
use My_trait {My_function as protected;}
}
Ще дам прост пример за използването на traits.
<?php //trait.php header('Content-type: text/plain; charset=utf-8'); //Деклариране на PHP Trait trait my_trait { //Функцията, налична в trait public function traitFunction() { echo "You`ll never see me cry!"; } } //Деклариране на класа, в който ще се добави trait class Greeting { use my_trait; //Добавя trait в класа } $obj = new Greeting(); $obj->traitFunction(); ?>
А, ако преработя файл constructor.php, съдържанието на който може да откриете на адрес
http://dreamlandpoly.blogspot.bg/p/magic-methods.html#constructor
резултатът ще е следния:
<?php //trait-1.php header('Content-Type: text/html; charset=utf-8'); trait trait_Elements { public function setName ($name){ $this->name = $name; } public function getName(){ echo "Металът е" . " " . $this->name . "." . "<br>"; } public function setPhysicalState ($physical_state){ $this-> physical_state = $physical_state; } public function getPhysicalState(){ echo "При обикновени условия се намира в" . " " . $this-> physical_state . " " . "агрегатно състояние." . "<br>"; } public function setBoilingTemperature ($boiling_temperature){ $this-> boiling_temperature = $boiling_temperature; } public function getBoilingTemperature(){ echo "Температурата му на кипене е" . " " . $this-> boiling_temperature . " ." ."<br/>"; } public function setMeltingTemperature ($melting_temperature){ $this-> melting_temperature = $melting_temperature; } public function getMeltingTemperature(){ echo "Температурата му на топене е" . " " . $this-> melting_temperature . " ." ."<br/>"; } } class metals { use trait_Elements; } $Sodium = new metals(); $Sodium->setName('Натрий'); $Sodium->getName(''); $Sodium->setPhysicalState ("твърдо"); $Sodium->getPhysicalState(""); $Sodium->setBoilingTemperature ("883°C"); $Sodium->getBoilingTemperature (""); $Sodium->setMeltingTemperature ("97,79°C"); $Sodium->getMeltingTemperature (""); ?>След изпълнение на файла trait-1.php, в прозореца на браузъра ще видите:
Повече за trait: http://php.net
Няма коментари:
Публикуване на коментар