Hướng dẫn dùng alias example trong PHP
Định nghĩa class trong PHPCác đối tượng trong PHP đều được dựa trên class. Nếu bạn muốn khởi tạo một đối tượng trong PHP, bạn cần phải khai báo class PHP nào được dùng để khởi tạo đối tượng đó. Ví dụ như khi bạn muốn khởi tạo một đối tượng
Có thể bạn đã biết, trong PHP có một loại đối tượng chung( generic object ), bạn có thể ngay lập tức gọi khởi tạo. Tuy nhiên, loại object đó cũng phải được dựa trên class, là stdClass. Nghĩa là khi bạn khai báo
cũng tương đương với
Việc khai báo class trong PHP là hết sức linh động. Khi bạn gọi keyword
Nguyên nhân cũng khá dễ hiểu, nếu như bạn áp dụng nguyên
tắc parsing của PHP như đã nói ở trên phải không. Với những ai đã quen thuộc với PHP, đây như là một lẽ tất nhiên vậy. Tuy nhiên, với những lập trình viên của một vài ngôn ngữ khác như ruby hay python, chuyện này khá là cản trở, phiền toái. Trong các ngôn ngữ đó, việc khai báo class cũng chỉ là một block code bình thường, không có nguyên tắc riêng gì áp dụng cho nó. Và rất nhiều những đặc điểm linh hoạt của các ngôn ngữ đó là hệ quả của điều này. Tuy nhiên, thật may mắn cho chúng ta ( đôi khi
cũng không hẳn là may mắn đâu xD ), PHP class cũng có những yếu tố "meta-programing" của riêng nó, khiến trong nhiều trường hợp, nó cũng có thể đạt được sự linh hoạt mong muốn. Trong bài viết này, chúng ta cũng tập trung vào một feature cụ thể như thế , đó là các Magic MethodsGiả sử như, bạn viết một đoạn code
chắc chắn, đoạn code này sẽ sinh lỗi ngay
Vẫn như thế, ta chưa khai báo cụ thể phương thức
Có vẻ như chương trình của chúng ta đã được thực thi thành công, chuyện gì đã xảy ra vậy. Đó là vì,
Đây là một tính năng hết sức hữu ích, cho phép người
lập trình quyết định chuyện gì sẽ xảy ra khi lập trình viên hay chương trình khác muốn gọi tới một phương thức trong đối tượng của họ. Nó cũng mang lại một sự linh hoạt nhất định, như ví dụ trong Magento, các getter và setter của framework này được dựa trên magic method
mà không cần phải định nghĩa cụ thể các phương thức Static Magic MethodsTa cùng xem xét một ví dụ khác
Cùng mổ xẻ đoạn code này một chút
nào. Ở đây, ta đã gọi đến một phương thức static là Các phương thức static vốn khá bị "mang tiếng" với những ai theo đuổi lập trình hướng đối tượng, một phần vì trong những ngày đầu, các lập trình viên java thường dùng cách này để viết code mang hơi hướng lập trình C ( vốn quen thuộc hơn với họ ) hơn là java. Chúng cũng, theo một cách nào đó, cho phép bạn đưa global state vào bên trong đối tượng object. Tuy nhiên, trong bài viết naỳ, tạm thời ta không đi quá sâu vào vấn đề đó. Thêm vào đó, static method của PHP càng hay thường gây khó hiểu bởi trước phiên bản 5.0, PHP còn cho phép bạn gọi tới bất kì phương thức nào của class với syntax giống như là gọi static. Ví dụ như đoạn code sau là hoàn toàn hợp lệ trong PHP 4
Ý tưởng của PHP 4 ở đây là cho phép developer có khả năng gọi đến mọi phương thức của object - bất kể trạng thái của nó - mà không cần phải khởi tạo đối tượng. Việc viết code như này trong các phiên bản mới hơn của PHP sẽ làm xảy ra lỗi Nói loanh quanh một hồi để làm gì ? Giờ ta cùng nhìn lại đoạn code ví dụ ở đầu mục, bạn nghĩ nó sẽ cho output như thế nào . Câu trả lời là
Thế có nghĩa là sao, như ở trên ta đã đc biết, khi gọi đến một method chưa được khai báo, nhưng nếu ta đã có khai báo phương thức
Vâng, Tóm lại, bài hhọc rút ra là nếu bạn đọc code xong truy ngược lên tất cả các kế thừa của class mà vẫn không hiểu phương thức mà nó gọi được định nghĩa ở đâu, thì khả năng lớn là ở đây, nó đã sử dụng magic method đó. Class AliasesTa cùng xem một ví dụ thực luôn, có thể tìm thấy trong framework Magento
Vâng, cái tên dài một cách hài hước. Tuy nhiên, trước phiên bản PHP 5.3, với sự ra đời của namespace, thì những đoạn code như thế này cũng không phải là quá hiếm. Và phương thức
từ đó về sau, chẳng hạn ta chỉ cần viết
PHP sẽ có khả năng hiểu , ở đây ta đang gọi đến class
Nói chung , với các phiên bản PHP mới, đặc biệt là từ sau 5.3 ( khi có |