4. Sử dụng traits trong class
Cú pháp khai báo traits:
trait Name { //code }
Trong đó Name là tên của traits của các bạn muốn đặt.
Để khai báo một traits trong một lớp ta có cú pháp sau:
<?php class MyClass { use TraitName; } ?>
Trong đó Myclass là tên class mà bạn muốn sử dụng traits, trait là tên traits mà bạn muốn đặt.
Ví dụ:
Khai báo một trait SetGeName có 2 phương thức setName() và getName()
<?php trait SetGetName { // private $name; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } }
Khai báo một trait SetGetAge có 2 phương thức setAge() và getAge() và namespace là SetGetAge
<?php namespace SetGetAge; trait SetGetAge{ public function setAge($age) { $this->age = $age; } public function getAge() { return $this->age; } }
Cuối cùng ta sẽ gọi 2 trait ở trên vào trong class ConNguoi và đồng thời khởi tạo luôn.
<?php // Nhúng 2 file chứa trait include 'SetGetName.php'; include 'SetGetAge.php'; //khai báo class ConNguoi class ConNguoi { private $name; private $age; //gọi trait SetGetName use SetGetName; //gọi trait SetGetAge use SetGetAge\SetGetAge; } //khởi tạo đối tượng. $connguoi = new ConNguoi(); // set name; $connguoi->setName('Thành Nguyễn '); // get name; echo $connguoi->getName(); //Tạo khoảng trắng cho dễ phân biệt echo '<br/>'; // set age $connguoi->setAge(18); //get age echo $connguoi->getAge(); //Kết quả chương trình trả về //Thành Nguyễn //18
5. Traits lồng trong PHP hướng đối tượng
Cũng như những cấu trúc câu điều kiện hay vòng lặp thì traits có thể sử dụng lồng nhau.
Cú pháp:
trait A { // } trait B { use A; // }
Lúc này thì khi ta gọi trait B thì ta cũng có thể sử dụng đầy đủ chức năng của trait A.
6. Phương thức tĩnh và phương thức trừu tượng trong traits
Trong traits thì đều có cho chúng ta cả phương thức và thuộc tính tĩnh, trừu tượng như một class bình thường. Các thuộc tính và phương thức tĩnh chỉ ảnh hưởng bên trong một class thôi còn khi gọi nó ở trong một class khác thì hoàn toàn bình thường.
Ví dụ:
Thuộc tính tĩnh trong traits
<?php // Khai báo trait Name trait Name { private static $name = 'Chưa xét'; public function setName($name) { self::$name = $name; } public function getName() { return self::$name; } } //Khai báo class ConNguoi class ConNguoi { //gọi trait Name use Name; } //Khai báo class NguoiLon class NguoiLon { //gọi trait Name use Name; } // khởi tạo class ConNguoi $connguoi = new ConNguoi(); //setName $connguoi->setName('Thành Nguyễn'); //getName echo $connguoi->getName(); //Kết Quả: Thành Nguyễn //Khởi tạo class ConNguoi $trecon = new ConNguoi(); //getName echo $trecon->getName(); //Kết Quả: Thành Nguyễn //Khởi tạo class NguoiLon $nguoilon = new NguoiLon(); //getName echo $nguoilon->getName(); //Kết Quả: Chưa xét
Phương thức trừu tượng:
<?php // Khai báo trait Name trait Name { public static function getName() { return 'Name Trait'; } } //Khai báo class ConNguoi class ConNguoi { //gọi trait Name use Name; } // khởi tạo class ConNguoi $connguoi = new ConNguoi(); //getName echo $connguoi->getName(); //Kết Quả: Name Trait //hoặc echo ConNguoi::getName(); //Kết Quả: Name Trait
7. Thay đổi phạm vi truy cập của traits trong OOP
Cú pháp:
use methodName as visibility;
trong đó : methodName là phương thức mà ta muốn thay đổi và visibility là 3 mức truy cập(public, private, protected).
Ví dụ:
<?php // Khai báo trait Name trait Name { //khai báo thuộc tính name= Thành Nguyễn private $name = 'Thành Nguyễn'; //định nghĩa phương thức getName abstract public function getName(); } //Khai báo class ConNguoi class ConNguoi { //gọi trait Name use Name; //khai báo và định nghĩa lại phương thức getName() public function getName() { return $this->name; } } // khởi tọa class ConNguoi $connguoi = new ConNguoi(); //getName echo $connguoi->getName(); //Kết Quả: Thành Nguyễn
8. Tạo định danh mới cho Traits và ưu tiên trong Traits
Sử dụng insteadof để xét độ ưu tiên cho phương thức bạn muốn sử dụng.
Ví dụ:
class ConNguoi { private $name; private $age; //gọi trait use SetGetName, SetGetAge { //ưu tiên sử dụng phương thức getall của trait SetGetAge SetGetAge::getAll insteadof SetGetName; } }
Cũng như ưu tiên phương thức thì ta cũng có thể tạo định danh mới cho traits.
Ví dụ: Vừa thay đổi phương thức và vừa tạo định danh mới cho phương thức getName.
<?php trait Name { private $name = 'Thành Nguyễn'; private function getName() { return $this->name; } } class ConNguoi { use Name { //Định danh mới cho getName getName as public doName; } } $connguoi = new ConNguoi(); echo $connguoi->doName(); //Kết Quả: Thành Nguyễn