Nhập môn lập trình hướng đối tượng với PHP (Phần 2)

Tiếp tục phần 1, trong phần 2 này chúng ta sẽ bàn về:

  • Thế nào là trait?
  • Thế nào là Namespaces?
  • Thế nào là magic functions

Traits là gì?

PHP là ngông ngữ chỉ hỗ trợ đơn kế thừa trong hướng đối tượng thên nên bạn muốn sử dụng lại source code một cách nhiều lần là rất khó khăn. Và để khắc phục điều đó thì từ PHP 5.4 trở lên, PHP hỗ trợ chúng ta traits.

  • Traits 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 một cách đơn giản hơn là kế thừa như trước.

  • Các đặc điểm của Traits:

    • Traits có chức năng gom các phương thức và thuộc tính chúng ta muốn sử dụng lại nhiều lần.
    • Traits như một abstract class (đều không khởi tạo được) nhưng không hoàn toàn giống nhau.
    • Các phương thức trong Traits có thể override lại trong class sử dụng nó.
  • Các ưu điểm:

    • Giảm việc lập lại code đáp ứng được nguyên tắc DRY - don't repeat yourself
    • Khắc phục được điểm yếu của đơn kế thừa của PHP
  • Nhược điểm: gây khó khăn cho chúng ta đọc được các phương thức từ một class sử dụng traits.

  • Khởi tạo:

    trait Name
    {
       //code
    }
    
  • Sử dụng Traits trong class:

    class ClassName
    {
       use TraitName;
    
       //code
    }
    
  • Traits lồng nhạu:

    trait A
    {
       //
    }
    trait B
    {
        use A;
       // 
    }
    
  • Insteadof

    Từ khóa này sẽ giúp ta xử lý trường hợp use 2 traits có các hàm giống nhau nhưng ta chỉ định được sẽ sử dụng hàm nào của trait nào.

    trait A
        {
            public function traitMethod ()
            {
            //
            }
        }
    
    trait B
    {
        public function traitMethod ()
        {
        //
        }
    
    class useTrait
    {
        use traitNameFirst, traitNameSecond 
        {
            A::traitMethod() insteadof B;
        }
    }
    

Thế nào là Namespaces (không gian tên).

Trong một dự án lớn có bao giờ bạn nghĩ ddeeens trường hợp là sẽ xảy ra các class có trùng tên không? Chính vì điều đó mà kể từ phiên bản PHP 5.3 trở đi thì PHP có hỗ trợ cho chúng ta chức năng mới là namespace.

  • Namespaces được hiểu là cách đóng gói các file php. Nó giúp giải quyết vấn đề tác quyền của thư viện đang sử dụng và việc phân biệt không gian tên của những thành phần code thường được tái sử dụng như class và function.
  • Khai báo namespace trong PHP ta sử dụng cú pháp sau:
    namespace Name;
    
  • Nạp namespace bằng use:
        use tenNamespace\tenClass;
    

Thế nào là magic functions.

Cái tên đã thể hiện sử ảo diệu của nó 😀. Đây là các phương thức đặc biệt được tạo ra nhằm giải quyết các vấn đề về sự kiện trong chương trình (cụ thể là với class).

Magic methods luôn có dạng __<method_name>, tất cả method dạng __<method_name> đều là từ khóa được reseved của PHP.

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

  • __construct hàm khởi tạo, được gọi khi khởi tạo mới đối tượng
  • __destruct hàm hủy, được gọi khi đối tượng bị hủy
  • __get được gọi khi lấy giá trị của thuộc tính
  • __set được gọi khi gán giá trị cho thuộc tính
  • __isset được gọi khi gọi hàm isset() hoặc empty() trên 1 thuộc tính không được phép truy cập
  • __unset được gọi khi gọi hàm unset() trên 1 thuộc tính không được phép truy cập
  • __call được gọi khi ta gọi đến một phương thức không tồn tại trong đối tượng
  • __callStatic được gọi khi ta gọi đến một phương thức tĩnh không tồn tại trong đối tượng
  • __toString được gọi khi ta gọi lệnh in 1 đối tượng ra dưới dạng chuỗi
  • __invoke được gọi khi một lệnh cố gắng gọi 1 đối tượng như 1 hàm
  • __sleep được gọi khi đối tượng được lưu tạm thời thành chuỗi với hàm serialize(), trả về mảng với các phần tử là thuộc tính sẽ được lưu vào chuỗi với hàm serialize()
  • __wakeup được gọi khi thực thi hàm unserialize()
  • __set_state đưọc gọi khi thực thi hàm var_export()
  • __clone được gọi khi sử dụng từ khóa clone, dùng để sao chép 1 đối tượng từ đối tượng có sẵn mà không cần khởi tạo mới và không gây ảnh hưởng hay làm mất đi dữ liệu của đối tượng ban đầu.
  • __debugInfo được gọi khi thực thi hàm var_dump()

Tạm kết phần 2.

Mình xin kết thúc phần 2 của loạt bài viết về lập trình hướng đối tượng với PHP tại đây. Tại phần 3 chúng ta sẽ tìm hiểu một vấn đề tương đối khó và dài đó là: Các phương pháp thiết kế hướng đối tượng (SOLID) . Hẹn gặp lại cac bạn trong bài viết tiếp theo.😀