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 чиқади
?>
name, age, population
хусусиятлари ва улар учун геттерлари бор
City классингизни амалга оширинг.
Кодни қисқартириш учун бизнинг классимиз
аллакача яратилган Helper трейтини
ишлатсин.