Трейти


Починаючи з версії 5.4.0 в PHP є можливість використання інструментарію для повторного використання коду. Він називається – трейт.

Трейт схожий на клас, але призначений для групування функціоналу структурованим чином. Неможливо створити самостійний екземпляр трейта. Це доповнення до звичайного наслідування, тобто можливість використання функціоналу класу без необхідності наслідування.

Приклад написання:

<?php
trait MyTrait {
	public function myFunc() {
		return 2 + 2;
	}
}
?>

Використання

Розглянемо приклад використання трейта на основі створення “Транслітератора” (суть: букви кирилиці переводимо в латиницю).

<?php
trait MyTransliterator {
	private $letters = array(
        'а' => 'a',   	'б' => 'b',     'в' => 'v',
        'г' => 'g',   	'д' => 'd',   	'е' => 'e',
        'ё' => 'e',   	'ж' => 'zh',  	'з' => 'z',
        'и' => 'i',   	'й' => 'y',   	'к' => 'k',
        'л' => 'l',   	'м' => 'm',   	'н' => 'n',
        'о' => 'o',   	'п' => 'p',   	'р' => 'r',
        'с' => 's',   	'т' => 't',   	'у' => 'u',
        'ф' => 'f',   	'х' => 'h',   	'ц' => 'c',
        'ч' => 'ch',  	'ш' => 'sh',  	'щ' => 'sch',
        'ь' => '',   	'ы' => 'y',   	'ъ' => '',
        'э' => 'e',   	'ю' => 'yu',  	'я' => 'ya',
        'А' => 'A',   	'Б' => 'B',   	'В' => 'V',
        'Г' => 'G',   	'Д' => 'D',   	'Е' => 'E',
        'Ё' => 'E',   	'Ж' => 'Zh',  	'З' => 'Z',
        'И' => 'I',   	'Й' => 'Y',   	'К' => 'K',
        'Л' => 'L',   	'М' => 'M',   	'Н' => 'N',
        'О' => 'O',   	'П' => 'P',   	'Р' => 'R',
        'С' => 'S',   	'Т' => 'T',   	'У' => 'U',
        'Ф' => 'F',   	'Х' => 'H',   	'Ц' => 'C',
        'Ч' => 'Ch',  	'Ш' => 'Sh',  	'Щ' => 'Sch',
        'Ь' => '',  	'Ы' => 'Y',   	'Ъ' => '_',
        'Э' => 'E',   	'Ю' => 'Yu',  	'Я' => 'Ya',
        'є' => 'ye', 	'ї' => 'yi', 	'і' => 'i',
        'Є' => 'YE', 	'Ї' => 'YI', 	'І' => 'I',
        ' ' => '_'
    );

	public function translate($str) {
		// замінюємо символи кирилиці на символи латиниці
		return strtr(trim($str), $this->letters);
	}
}

class MyClass {
	use MyTransliterator;
	
	private $data;
	
	/**
	*	Якась функція для додавання даних в наш масив
	*/
	public function setData(array $data) {
		$this->data = $data;
	}
	
	/**
	*	 Якась фукнція для підготовки даних
	*/
	public function getPreparedData() {
		// припустимо, ми хочемо зробити адресу сторінки за назвою
		// тоді, нам потрібно перевести назву з кириличними символами на латиницю
		$this->data['url'] = strtolower($this->translate($this->data['title']));
		
		return $this->data;
	}
}

$obj = new MyClass;

$obj->setData([
	'title' => 'Не дуже проста назва для сторінки',
	'content' => 'Текст сторінки'
]);

$data = $obj->getPreparedData();

echo "<pre>";
print_r($data);
echo "</pre>";
?>

Результат:

Array
(
    [title] => Не дуже проста назва для сторінки
    [content] => Текст сторінки
    [url] => ne_dyje_prosta_nazva_dlya_storіnku
)
Зміст
Наступний урок