ტრეიტები OOP-ში PHP-ში
როგორც უკვე იცით, PHP-ში შეუძლებელია მრავალი კლასიდან ერთდროულად მემკვიდრეობის მიღება, მხოლოდ ერთიდან. ადრე ჩვენ უკვე განვიხილეთ ამ პრობლემის გადაწყვეტა: მემკვიდრეობის ნაცვლად გამოიყენეთ ერთი კლასის ობიექტები სხვა კლასებში.
PHP-ში არსებობს კიდევ ერთი გზა. იგი მდგომარეობს ტრეიტების გამოყენებაში. ტრეიტი წარმოადგენს თვისებებისა და მეთოდების ერთობლიობას, რომელიც შესაძლებელია ჩაირთოს სხვა კლასში. ამ შემთხვევაში თვისებები და ტრეიტის მეთოდები კლასის მიერ აღიქმება როგორც საკუთარი.
ტრეიტის სინტაქსი იგივეა, რაც კლასისა,
გარდა იმისა, რომ ტრეიტის სახელი უნდა
გამოცხადდეს საკვანძო სიტყვის
გამოყენებით trait.
ტრეიტის ეგზემპლარის შექმნა შეუძლებელია - ტრეიტები
განკუთვნილია მხოლოდ სხვა კლასებთან მისაერთებლად.
მიერთება ხორციელდება
ბრძანების use გამოყენებით, რის შემდეგაც
გამოყოფილში მითითებულია შესაერთებელი ტრეიტის სახელი.
ეს ბრძანება იწერება კლასის დასაწყისში.
მოდით ვნახოთ ტრეიტების გამოყენება პრაქტიკულ
მაგალითზე. დავუშვათ, ჩვენ გვაქვს მოცემული ასეთი ტრეიტი
Helper, რომელიც შეიცავს პრივატულ თვისებებს
name და age, ასევე მათ გეთერებს:
<?php
trait Helper
{
private $name;
private $age;
public function getName()
{
return $this->name;
}
public function getAge()
{
return $this->age;
}
}
?>
დავუშვათ, ჩვენ ასევე გვაქვს ასეთი კლასი User,
რომლის კონსტრუქტორშიაც მინიჭებულია თვისებები
name და age:
<?php
class User
{
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
მოდით ახლა დავამატოთ გეთერები თვისებებისთვის
ჩვენი კლასის User. მხოლოდ არ
ჩავწეროთ ისინი თავად კლასში, არამედ უბრალოდ მივაერთოთ
ტრეიტი Helper, რომელშიც ეს მეთოდები
უკვე რეალიზებულია:
<?php
class User
{
use Helper; // ვაერთებთ ტრეიტს
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
ტრეიტის მიერთების შემდეგ ჩვენს კლასში გამოჩნდება ამ ტრეიტის მეთოდები და თვისებები. ამ შემთხვევაში მათთან მივმართავთ ისე, თითქოს ისინი კლასის საკუთარი მეთოდები და თვისებები არიან:
<?php
$user = new User('john', 30);
echo $user->getName(); // გამოიტანს 'john'
echo $user->getAge(); // გამოიტანს 30
?>
რეალიზება გაუკეთეთ კლასს City თვისებებით
name, age, population
და მათი გეთერებით. დავუშვათ, ჩვენმა კლასმა
საკუთარი კოდის შესამოკლებლად გამოიყენოს ჩვენ მიერ უკვე შექმნილი
ტრეიტი Helper.