<?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('Vũ Thanh Tài');
//getName
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài
//Khởi tạo class ConNguoi
$trecon = new ConNguoi();
//getName
echo $trecon->getName();
//Kết Quả: Vũ Thanh Tài
//Khởi tạo class NguoiLon
$nguoilon = new NguoiLon();
//getName
echo $nguoilon->getName();
//Kết Quả: Chưa xét
Phương thức tĩnh
C:\xampp\htdocs\php\b.php
<?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
Phương thức trừu tượng trong trait
C:\xampp\htdocs\php\b.php
<?php
// Khai báo trait Name
trait Name {
//khai báo thuộc tính name= vũ Thanh Tài
private $name = 'Vũ Thanh Tài';
//đị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ả: Vũ Thanh Tài
Thay đổi visibility của phương thức trait
C:\xampp\htdocs\php\b.php
<?php
trait Name {
private $name = 'Vũ Thanh Tài';
private function getName() {
return $this->name;
}
}
class ConNguoi {
use Name {
//thay đổi visibitily thành public
getName as public;
}
}
$connguoi = new ConNguoi();
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài
Tạo định danh mới cho Traits
C:\xampp\htdocs\php\b.php
<?php
trait Name {
private $name = 'Vũ Thanh Tài';
public function getName() {
return $this->name;
}
}
class ConNguoi {
use Name {
//Định danh mới cho getName
getName as doName;
}
}
$connguoi = new ConNguoi();
echo $connguoi->doName();
//Kết Quả: Vũ Thanh Tài
C:\xampp\htdocs\php\b.php
<?php
trait Name {
private $name = 'Vũ Thanh Tài';
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ả: Vũ Thanh Tài
Tiếp tục với phần trước phần này chúng ta sẽ tìm hiểu nốt về các vấn đề liên quan đến Traits (mà mình biết).Mục Lục
-Trong Traits có hỗ trợ cho chúng ta cả phương thức tĩnh và thuộc tính tĩnh như một class bình thường.
Thuộc tính tĩnh
VD: 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('Vũ Thanh Tài');
//getName
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài
//Khởi tạo class ConNguoi
$trecon = new ConNguoi();
//getName
echo $trecon->getName();
//Kết Quả: Vũ Thanh Tài
//Khởi tạo class NguoiLon
$nguoilon = new NguoiLon();
//getName
echo $nguoilon->getName();
//Kết Quả: Chưa xét
Kết Luận: Như vậy Thuộc tính tĩnh chỉ ảnh hưởng bên trong một class thôi còn khi gọi nó ở tron một class khác thì hoàn toàn bình thường.
Phương thức tĩnh
VD: Phương thức tĩnh trong trait.
<?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
Kết Luận: Phương thức tĩnh trong trait hoàn toàn giống phương thức tĩnh trong class.
<?php
// Khai báo trait Name
trait Name
{
//khai báo thuộc tính name= vũ Thanh Tài
private $name = 'Vũ Thanh Tài';
//đị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ả: Vũ Thanh Tài
3, Thay đổi visibility của phương thức trait.
-Có đôi khi các bạn muốn thay đổi visibility (phạm vi truy cập) của một hoặc nhiều phương thức trong traits thì phải làm sao? Trong PHP cũng có hỗ trợ chúng ta thay đổi visibility của phương thức trong traits với cú pháp như sau:
use methodName as visibility;
Trong đó:
methodName là phương thức các bạn muốn thay đổi.
visibility là một trong 3 mức truy cập: public,protected, private.
VD:
<?php
trait Name
{
private $name = 'Vũ Thanh Tài';
private function getName()
{
return $this->name;
}
}
class ConNguoi
{
use Name {
//thay đổi visibitily thành public
getName as public;
}
}
$connguoi = new ConNguoi();
echo $connguoi->getName();
//Kết Quả: Vũ Thanh Tài
4, Tạo định danh mới cho Traits.
-Không những bạn có thể ưu tiên phương thức trong traits hay thay đổi visibility, mà bạn còn có thể tạo định danh mới cho traits trong PHP nữa.
VD: Tạo định danh mới cho phương thức getName thành doName.
<?php
trait Name
{
private $name = 'Vũ Thanh Tài';
public function getName()
{
return $this->name;
}
}
class ConNguoi
{
use Name {
//Định danh mới cho getName
getName as doName;
}
}
$connguoi = new ConNguoi();
echo $connguoi->doName();
//Kết Quả: Vũ Thanh Tài
-Hoặc chúng ta cũng có thể vừa thay đổi visibility vừa tạo định danh mới cho phương thức.
VD: Vừa thay đổi visibility vừa tạo định danh mới cho phương thức getName.
<?php
trait Name
{
private $name = 'Vũ Thanh Tài';
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ả: Vũ Thanh Tài
5, So sánh Traits với abstract và interface.
Traits với interface
-Giống nhau: Đều không có thể khởi tạo được mà chỉ có thể khai báo.
-Khác nhau:
Trait:
Có thể khai báo thuộc tính.
Có thể định nghĩa và khởi tạo phương thức.
interface:
Chỉ có thể khai báo thuộc tính cố định (hằng).
Chỉ có thể định nghĩa không thể khai báo.
Traits với abstract
-Giống nhau: Đều không có thể khởi tạo được mà chỉ có thể khai báo.
-Khác nhau:
Trait:
Có thể lồng nhau một cách đơn giản
abstract:
Khi muốn sử dụng lẫn nhau phải kế thừa hết sức lằng nhằng.
6, Lời kết.
-Qua 2 phần trình bày về traits của mình (xem phần 1), mình hi vọng mọi người có thể hiểu hết được các vấn đề của mình đưa ra. Đó mới chỉ là những gì mà mình biết về Traits thôi còn các bạn nào muốn tìm hiểu thêm có thể tham khảo tại link.