Từ khóa “use” trong PHP ?

Nếu bạn viết PHP, bạn đã biết đến từ khóa này chưa ? Hãy thử tạo vào chạy một file php như sau:

<?php

use 'xxx.php'; // với xxx.php là một file php nào đó.

Đây là thông báo lỗi fatal bạn nhận được:

Fatal error: use: Not yet supported. Please use include_once() or require_once() in E:\www\5.php on line 2

Tôi tìm ra được nó khi đang đọc mã nguồn của Zend Engine (v2 PHP 5.2.1). Nó được khai báo như một từ khóa trong PHP. Tôi thử viết nó ra Eclipse PDT, PHP IDE của tôi, thì khá ngạc nhiên vì nó được highlight như một keyword. Vậy đích thị nó là một từ khóa mà Andi và Zeev đã định đưa vào PHP nhưng vì một lý do nào đó mà họ chưa làm điều này. Vậy đây là từ khóa để làm gì ?

Xem câu thông báo lỗi trên cộng với ngữ nghĩa của từ “use” thì ta có thể đoán ra là nó được dùng để load một class hoặc một namespace (?!!). Như mọi người đã biết, PHP6 được xem là sẽ hỗ trợ namespace, mà PHP 5.2 thì cũn rất gần PHP6 rồi. Tôi lật đật download mã nguồn PHP 4.4.6 để tham khảo và vẫn thấy nó “chễm chệ” trong đó ! Vậy từ khóa “use” có phải là để chuẩn bị cho sự hỗ trợ namespace trong PHP6 ???

Có thể là đúng hoặc cũng rất có thể là nó chỉ được lên kết hoạch để sử dụng trong việc load class trong PHP4 và PHP5. Nếu như thế thì cũng dễ hiểu tại sao nó được “Not yet supported” ! PHP là một ngôn ngữ text-processing, mã PHP không được compile vào một chỗ, PHP coder chỉ load một file mã thay vì load chính xác một class, hay một hàm nào đó ra để sử dụng (như kiểu trong C++ có chỉ thị “using …” ). Nếu sử dụng từ khóa use như kiểu trên, PHP coder chắc chắn phải init một cái gì đó trước khi đi vào phần mã chính của ứng dụng, bên cạnh đó sẽ nảy sinh ra nhu cầu phải có một quy tắc về cách lưu trữ các class trong các file mã PHP. Ví dụ class phải được đặt ở đâu, thư mục nào (phải init trước), trong file class sẽ có những gì … Cách làm việc đó không giống với bản chất của PHP nói riêng hay một ngôn ngữ text-processing nói chung (tất nhiên sẽ khác nếu bạn sử dụng một PHP framework tốt).

Đây cũng chính là vấn đề mà theo tôi là làm đau đầu các nhà phát triển PHP, khiến họ không dứt khoát trong việc đưa namespace vào PHP. Nếu hỗ trợ namespace, PHP coder sẽ phải map các class (thực ra là được đặt trong các file) thuộc một namespace như thế nào  để tránh tình trạng khai báo tất cả vào một file text dài gần 10000 dòng ? Hoặc, làm thế nào để chỉ load một lớp con của một namespace, chẳng hạn Zend::Json (hay Zend/Json) ? Như vậy việc load các namespace vào mã nguồn sẽ làm ứng dụng chạy chậm hơn vì Zend Engine phải mất thời gian parse và định vị các class, các hàm trong namespace ?

Anyway, hãy trông đợi !


About this entry