Traits στην αντικειμενοστρεφή προγραμματισμό σε PHP
Όπως ήδη γνωρίζετε, στην PHP δεν μπορείτε να κληρονομήσετε από πολλαπλές κλάσεις ταυτόχρονα, μόνο από μία. Νωρίτερα είχαμε ήδη δει μια λύση σε αυτό το πρόβλημα: αντί για κληρονομικότητα, χρησιμοποιήστε αντικείμενα μερικών κλάσεων μέσα σε άλλες.
Στην PHP υπάρχει και ένας άλλος τρόπος. Αυτός συνίσταται στη χρήση traits. Ένα trait αντιπροσωπεύει ένα σύνολο ιδιοτήτων και μεθόδων που μπορούν να συμπεριληφθούν σε μια άλλη κλάση. Σε αυτή την περίπτωση, οι ιδιότητες και οι μέθοδοι του trait θα γίνουν αντιληπτές από την κλάση σαν δικές της.
Η σύνταξη ενός trait είναι η ίδια με αυτή μιας κλάσης,
με την εξαίρεση ότι το όνομα του trait πρέπει
να δηλωθεί χρησιμοποιώντας τη λέξη-κλειδί
trait.
Δεν μπορείτε να δημιουργήσετε ένα στιγμιότυπο ενός trait - τα traits
προορίζονται μόνο για σύνδεση σε άλλες
κλάσεις. Η ίδια η σύνδεση πραγματοποιείται
με την εντολή use, μετά από την οποία
ακολουθεί, διαχωρισμένο με κενό, το όνομα του trait που συνδέεται.
Αυτή η εντολή γράφεται στην αρχή της κλάσης.
Ας δούμε την εφαρμογή των traits με ένα πρακτικό
παράδειγμα. Ας υποθέσουμε ότι μας δίνεται αυτό το trait
Helper, που περιέχει τις ιδιωτικές ιδιότητες
name και age, καθώς και τους getters τους:
<?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;
}
}
?>
Ας προσθέσουμε τώρα getters για τις ιδιότητες
της κλάσης μας User. Μόνο που δεν θα
τις γράψουμε στην ίδια την κλάση, αλλά απλά θα συνδέσουμε
το trait Helper, στο οποίο αυτές οι μέθοδοι
έχουν ήδη υλοποιηθεί:
<?php
class User
{
use Helper; // συνδέουμε το trait
public function __construct($name, $age)
{
$this->name = $name;
$this->age = $age;
}
}
?>
Μετά τη σύνδεση του trait, στην κλάση μας θα εμφανιστούν οι μέθοδοι και οι ιδιότητες αυτού του trait. Σε αυτή την περίπτωση θα αναφερόμαστε σε αυτές σαν να ήταν μέθοδοι και ιδιότητες της ίδιας της κλάσης:
<?php
$user = new User('john', 30);
echo $user->getName(); // θα εμφανίσει 'john'
echo $user->getAge(); // θα εμφανίσει 30
?>
Υλοποιήστε την κλάση City με ιδιότητες
name, age, population
και getters για αυτές. Αφήστε την κλάση μας
για συντομία του κώδικά της να χρησιμοποιεί το trait
Helper που έχουμε ήδη δημιουργήσει.