Lập trình hướng đối tượng[PHP]-Phần 3

0

Thế nào là Trait

Trait được giới thiệu trong PHP phiên bản 5.4.0 và được định nghĩa là một cơ chế cho phép lập trình viên tận dụng khả năng tái sử dụng lại code (code reusability) khi lập trình với ngôn ngữ chỉ cho phép thừa kế từ một class duy nhất (hay còn gọi là single inheritance) như PHP. Vậy Trait là gì? Trait là một module giúp cho chúng ta có thể sử dụng lại các phương thức được khai báo trong trait vào các class khác nhau hoặc trong các trait khác một cách đơn giản hơn là kế thừa như trước. Một trait tương tự như là 1 class nhưng chỉ nhằm mục đích nhóm chức năng lại. Và trait không thể khởi tạo giống class và trait sinh ra để bổ sung cho kế thừa truyền thống. Thay vì phải kế thừa 1 class hay interface để sử dụng lại 1 nhóm chức năng, thì với trait bạn không cần phải kế thừa vẫn có thể sử dụng được. Ví dụ:

<?php
class Database
{
	public function listUsers()
	{
		return "List User";
	}
}
/**
* 
*/
class Report extends Database
{
	
	public function reportUsers()
	{
		$this->listUsers();
	}
}
/**
* 
*/
class Users extends Database
{
	public function index()
	{
		$this->listUsers();
	}	
}

Đây là trường hợp không sử dụng trait và cũng không biết dùng trait ở đâu ????. Mà ta thấy nếu có nếu có quá nhiều class thì việc extends lại sẽ làm ảnh hưởng rất nhiều đến công việc, tài nguyên, hiệu năng. Hướng giải quyết như sau:

<?php
trait Database
{
	public function listUsers()
	{
		return "List User";
	}
}
/**
* 
*/
class Users
{
	use Database;

	public function reportUsers()
	{
		$this->listUsers();
	}
}
/**
* 
*/
class Report
{
	use Database;

	public function reportUsers()
	{
		$this->listUsers();
	}
}


Các bạn thấy không, mình không cần extends nhưng vẫn có thể sử dụng lại các phương thức của method listUsers() như trên.???? Để sử dụng trait trong PHP thì các bạn chỉ cần dùng từ khóa use để gọi trait bạn muốn sử dụng trong code của bạn. Sau đó bạn có thể sử dụng các phương thức trong trait mà bạn đã use.

Tiếp theo, chúng ta sẽ tìm hiểu về 1 phần rất quan trọng trong trait đó là trait lồng. Bạn đã bao giờ nghĩ nếu có 100 trait, ta sẽ use tận 100 lần. Điều này là không nên. Nhìn rất củ chuối =))) Ví dụ:

<?php
trait Hello {
    public function sayHello() {
        echo 'Hello ';
    }
}

trait World {
    public function sayWorld() {
        echo 'World!';
    }
}

trait HelloWorld {
    use Hello, World;
}

class MyHelloWorld {
    use HelloWorld;
}

$o = new MyHelloWorld();
$o->sayHello();
$o->sayWorld();
// kết quả : Hello World!


Việc sử dụng trait lồng không quá phức tạp và là cách giúp cho code dễ nhìn, hiệu quả hơn.

Thế nào là namespace

  • Khái niệm: Theo php.net thì nó là cách để đóng gói những file php. Được thiết kế để giải quyết 2 vấn đề là thể hiện được tác quyền của thư viện đang sử dụng và sự đụng độ không gian tên trên những ứng dụng khi tạo ra những thành phần code tái sử dụng như các classes hay functions.
  • Định nghĩa: Được khai báo với từ khóa namespace. Mỗi file chứa 1 namespace phải được khai báo trên cùng trước các code khác trong file. Cách thực hành tốt nhất là mỗi file chứa 1 class với tên class trùng với tên file đồng thời có 1 namespace mô tả được đường dẫn tới file đó
  • Khai báo : Giống như đường dẫn tới thư mục. Cách thực hành tốt nhất là nên đặt namespaces theo cấu trúc thư mục chứa nó, điều này là tuyệt vời khi kết hợp với autoloading trong PHP. VD: Tạo 1 class HomeController và đặt tên như sau:
namespace App\Http\Controllers\

Sử dụng name space:

use App\Repositories\Library\LibraryRepositoryInterface;

Thế nào là Magic methods

Magic methods là các phương thức đặc biệt để tùy biến các các sự kiện trong php. Hiểu đơn giản là nó cung cấp thêm cách để giải quyết một vấn đề. Magic methods được dùng để xử lý các đối tượng trong lập trình hướng đối tượng.

Các magic methods:

-Trong PHP có hỗ trợ chúng ta 15 magic method với từng chức năng khác nhau:

__construct(): đây là 1 method rất là phổ biến mà chúng ta hay thường gặp nhất.Hàm __construct() sẽ tự đông được gọi khi ta khởi tạo 1 đối tượng( còn được gọi là hàm khởi tạo).

__destruct(): gọi khi hủy đối tượng.

__set(): Gọi khi ta truyền dữ liệu vào thuộc tính không tồn tại hoặc thuộc tính private trong đối tượng.

__get(): khi đọc dữ liệu từ một thuộc tính không được phép truy cập.

__isset(): được gọi khi gọi hàm isset() hoặc empty() trên một thuộc tính không được phép truy cập.

__unset(): được gọi khi hàm unset() được sử dụng trong một thuộc tính không được phép truy cập.

__call():được gọi khi ta gọi một phương thức không được phép truy cập trong phạm vi của một đối tượng.

__callstatic(): được kích hoạt khi ta gọi một phương thức không được phép truy cập trong phạm vi của một phương thức tĩnh.

__toString(): phương thức này giúp class chỉ định xem sẽ in ra cái gì khi nó được dùng.

__invoke():phương thức này được gọi khi một lệnh cố gắng gọi một đối tượng như một hàm.

__sleep(): được gọi khi serialize() một đối tượng.

__wakeup: được gọi khi unserialize() đối tượng.

__set_state():

__clone(): được sử dụng khi chúng ta clone một object.

__debugInfo(): được gọi khi chúng ta sử dụng hàm vardump().

Leave A Reply

Your email address will not be published.