Get in touch
or send us a question?
CONTACT

PHP Reflection

Reflection là gì?

Reflection trong phát triển phần mềm là một thứ được sử dụng khá thường xuyên, nhưng hiếm khi trở thành một chủ đề được dạy khi học cách viết mã. Đối với tôi, Reflection thực sự chỉ là một khái niệm mà tôi tình cờ gặp được trên đường đi, tôi không biết tại sao bạn sẽ sử dụng nó hay nó sẽ mang đến những cơ hội gì.

Reflection là nơi một đối tượng có thể tự kiểm tra nội tâm để thông báo cho bạn về các phương thức và thuộc tính của nó trong thời gian chạy.

Về mặt nó, điều này có vẻ không phải là thứ gì đó sẽ đặc biệt hữu ích. Tuy nhiên, Reflection thực sự là một khía cạnh thực sự thú vị của phát triển phần mềm và nó là thứ mà bạn có thể sẽ tiếp xúc thường xuyên.

Trong bài viết này, tôi sẽ xem xét cách chúng ta có thể sử dụng Reflection trong PHP.

Tại sao Reflection lại hữu ích?

Reflection , như tên của nó, là khả năng chương trình máy tính tự kiểm tra và cho bạn biết về các thuộc tính, phương pháp và kiểu đối tượng mà bạn đang làm việc.

Điều này hữu ích trong một số cách và tình huống khác nhau.

Một trong những cách phổ biến nhất mà Reflection hữu ích là gỡ lỗi mã của bạn. Bạn có thể đã sử dụng các hàm get_class()và get_class_methods()khi làm việc với một đối tượng được đặt tên không rõ ràng. Khả năng nhận được kiểu hoặc các phương thức của một đối tượng khi bạn không biết đó là loại đối tượng nào, là Phản chiếu.

Một cách sử dụng phổ biến khác của Reflection là để tạo tài liệu. Sẽ rất tốn công sức để viết tài liệu về mọi phương thức của mọi lớp của một khuôn khổ hoặc ứng dụng lớn. Thay vào đó, Reflection có thể tự động tạo tài liệu cho bạn. Nó thực hiện điều này bằng cách kiểm tra từng phương thức, hàm tạo và lớp để xác định cái gì đi vào và cái gì đi ra.

Laravel cũng sử dụng rất tốt Reflection để tự động đưa các phụ thuộc vào các lớp của bạn thông qua vùng chứa IoC. Khi bạn viết một cái gì đó như thế này trong Laravel:

class UserController
{
    public function __construct(User $user)
    {
        $this->user = $user;
    }
}

Laravel biết rằng nó cần phải đưa vào một phiên bản của User. Laravel có thể làm điều đó bằng cách sử dụng Reflection để kiểm tra đối số phương thức gợi ý kiểu và giải quyết phụ thuộc tự động cho bạn.

Các hàm phản chiếu PHP phổ biến

Như tôi đã đề cập ở trên, hai hàm PHP Reflection mà tôi sử dụng thường xuyên nhất là get_class()khi get_class_methods()tôi làm việc với mã của người khác. Thường nhanh hơn khi chỉ đổ một đối tượng ra ngoài, thay vì kéo luồng để xem đối tượng đó bắt nguồn từ đâu.

Sử dụng các chức năng này thực sự dễ dàng:

// An unknown object appeared!
var_dump(get_class($pokemon)); // Pokemon\Electricity\Pikachu

var_dump(get_class_methods($pokemon));
// Tail Whip
// Thunder Bold
// Thunder

Hàm get_class()sẽ trả về một chuỗi tên lớp và get_class_methods()hàm sẽ trả về một mảng các phương thức có sẵn trên đối tượng.

Một chức năng phổ biến khác là method_exists()chức năng. Bạn sẽ thường thấy điều này được sử dụng bên trong các phương thức ma thuật __get()hoặc __set()phương thức của một đối tượng để xem liệu phương thức getter hoặc setter có khả dụng trên đối tượng hay không:

class User {

    protected function getUsername() {}

    public function __get($param)
    {
        $method = 'get'.ucfirst($param);

        if (method_exists($this, $method))

        return $this->{$method}();
    }
}

Điều này cho phép bạn sử dụng các phương thức getter và setter trong khi vẫn duy trì $user->usernameAPI đẹp hơn. Trong ví dụ trên, hàm method_existschấp nhận đối tượng hiện tại ( $this) và tên của phương thức bạn đang tìm kiếm ( $method).