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
Няма коментари:
Публикуване на коментар