Стандарти в РНР (Част 2)

Traits в РНР


Какво са traits?


traits.png
Traits са сравнително нова концепция, въведена в PHP 5.4.0 ( https://en.wikipedia.org/wiki/Trait_(computer_programming)). Те позволяват преизползване на код (PHP скрипт) в няколко независими класа, намиращи се в различни класови йерархии, като по този начин се намалява дублирането на скрипта и се спазва DRY (Do not repeat yourself) принципът в програмирането.

Създаване на trait


Създаването на trait се осъществява с помощта на ключовата дума trait:

str.png

trait My_trait {
public function My_function () {
//... съдържание на функцията
}
}

Добавяне на trait към клас


Добавянето на trait към клас се осъществява с помощта на оператора use.

str.png

class My_class {

use My_trait;

}

Може би вече ви е направило впечатление, че и namespace, и trait се добавят към класа с ключовата дума use. Импортването им, обаче, се осъществява по различен начин: добавянето на namespaces, класове, интерфейси, функции и канстанти, се осъществява извън класовата дефиниция, а traits се импортват вътре в класовата дефиниция.
РНР интерпретаторът копира и пейства trait в дефиницията на класа по време на компилиране на файла. Ако някои методи и свойства не са дефинирани в trait, е необходимо да бъдат дефинирани в класа.

Промяна на видимостта на методите от trait


За да променим видимостта на методите от trait, ни е необходима ключовата дума as.

str.png

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();
?>
trait.png
Trait в РНР

А, ако преработя файл 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-1.png
Trait в РНР
Повече за trait: http://php.net

Няма коментари:

Публикуване на коментар