PHP nhận tất cả các lớp trong không gian tên

Tôi không nói về biểu tượng phân cách. Đó là một chi tiết không liên quan. Tôi nghi ngờ rằng việc đạp xe về nó đã chuyển hướng sự chú ý khỏi các vấn đề thực tế

Tôi đã tìm thấy các không gian tên được giới thiệu trong PHP 5. 3 gặp phải nhiều vấn đề về khả năng sử dụng do đánh đổi hiệu suất, hạn chế của trình phân tích cú pháp của PHP, xung đột với các tính năng PHP khác và các quyết định thiết kế không may

Bạn không thể nhập một không gian tên

Câu lệnh

new List_DoublyLinked[];
3 của PHP chỉ có thể nhập tên của các lớp/không gian tên riêng lẻ. Không có cách nào để nhập hàng loạt một không gian tên

Dù bạn làm gì, bạn không thể tránh viết tên lớp đủ điều kiện ít nhất một lần. Trừ khi các tên được sử dụng nhiều lần, các không gian tên cuối cùng sẽ bị âm đối với độ dài mã

Đã sửa lỗi trong PHP 7. Trước đây không có tốc ký để nhập nhiều tên từ một không gian tên, nhưng bây giờ câu lệnh

new List_DoublyLinked[];
3 chấp nhận các nhóm

use FooLibrary\{Foo, Bar, Baz};

Bạn không thể tránh lặp lại câu lệnh
new List_DoublyLinked[];
3 trên các tệp

Điều đó không có nghĩa là

new List_DoublyLinked[];
3 sẽ hoạt động trên toàn cầu, vì điều này rõ ràng là đánh bại mục đích

Bởi vì quá trình nhập dài dòng và đôi khi tẻ nhạt để duy trì, sẽ tốt hơn nếu tránh lặp lại chúng theo cách thủ công trong mọi tệp và e. g. tải bộ nhập được sử dụng thường xuyên nhất từ ​​​​một tệp

Cách giải quyết thông qua

new List_DoublyLinked[];
7 để lại nhiều điều mong muốn

  • Nó tải các lớp ngay lập tức, vì vậy nó không phù hợp để mô phỏng
    new List_DoublyLinked[];
    8
  • Nó tạo ra một tên giới hạn trong một không gian tên cụ thể, để lại sự lựa chọn giữa một tên chung [đánh bại mục đích của các không gian tên] hoặc một tên trong một số không gian tên [vẫn yêu cầu các câu lệnh
    new List_DoublyLinked[];
    3 trong các dự án sử dụng các không gian tên phụ]

Quên nhập khẩu/bí danh

Sẽ không thực tế nếu chỉ sao chép các câu lệnh

new List_DoublyLinked[];
3 cho tất cả các lớp vào tất cả các tệp, vì vậy bạn cần chọn mục nhập nào sẽ được khai báo trong mỗi tệp và danh sách sẽ thay đổi từ tệp này sang tệp khác

Do đó, bất cứ khi nào một tên không đủ tiêu chuẩn được sử dụng trong một tệp, bạn cần đảm bảo rằng tên đó có trong danh sách nhập của tệp. Lỗi do thiếu bí danh sẽ không được báo cáo cho đến khi mã được chạy

Di chuyển mã được đặt tên giữa các tệp khó hơn và dễ bị lỗi hơn. Bí danh phải được sao chép, nhưng chúng cần được sao chép có chọn lọc, vì sẽ xảy ra lỗi khi khai báo cùng một bí danh hai lần

Bí danh không hoạt động với API hoạt động trên các lớp

Đã sửa lỗi trong PHP 5. 6. Khi các không gian tên được giới thiệu, không có cách nào đơn giản để có được một tên đủ điều kiện từ một tên bí danh được sử dụng trong mã. Sau này PHP đã thêm cú pháp

new List_DoublyLinked[];
2 cho việc này

Không gian tên PHP tăng cơ hội xung đột với các từ dành riêng

Các tên được đặt tên không phải là mã thông báo trong trình phân tích cú pháp PHP [

new List_DoublyLinked[];
3 là mã thông báo phân tách], có nghĩa là việc sử dụng một từ dành riêng làm bất kỳ phần nào trong “đường dẫn” của không gian tên là một lỗi phân tích cú pháp. Có thể mã hoạt động mà không có không gian tên

new List_DoublyLinked[];

trở nên không hợp lệ khi được đặt tên

Trên đây là một lỗi phân tích cú pháp, bởi vì

new List_DoublyLinked[];
4 là một từ khóa toàn cầu dành riêng. Vấn đề này không thể tránh được với câu lệnh
new List_DoublyLinked[];
3, vì nó cũng sẽ không phân tích cú pháp

Không gian tên lồng nhau được nướng một nửa

Khái niệm không gian tên phụ của PHP chỉ là một đường cú pháp nông để tham chiếu rõ ràng đến các không gian tên khác. Không giống như một số ngôn ngữ khác, nó không ảnh hưởng đến việc tra cứu tên không đủ tiêu chuẩn

Không gian tên phụ không được “nhúng” vào không gian tên cha của chúng. Chúng là các không gian tên cấp cao nhất riêng biệt chỉ xảy ra để chia sẻ tiền tố tên

Đoạn mã trên không hoạt động, bởi vì PHP coi

new List_DoublyLinked[];
6 và
new List_DoublyLinked[];
7 là hai không gian tên độc lập. Không gian tên phụ không thể đơn giản sử dụng các lớp của không gian tên “cha” của chúng. Các khai báo không gian tên thậm chí không thể được lồng vào nhau

Tra cứu tên là kỳ quặc và không nhất quán

Khá dễ dàng để nhận thấy rằng việc thiếu tự động tra cứu tên trong các không gian tên gốc dẫn đến sự bùng nổ của các câu lệnh

new List_DoublyLinked[];
3 hoặc sử dụng các tên đầy đủ dài dòng. PHP khắc phục sự cố này, nhưng chỉ đối với tên hàm và hằng và chỉ đối với không gian tên chung

Điều trên sẽ thất bại nếu

new List_DoublyLinked[];
9 không tồn tại và PHP sẽ không cố gắng tìm
class Foo\Bar\Someclass {…}
0 hay thậm chí là
class Foo\Bar\Someclass {…}
1

Không gian tên

class Foo\Bar\Someclass {…}
2 bị bỏ qua khi tìm kiếm các chức năng, do đó, một chức năng toàn cầu
class Foo\Bar\Someclass {…}
3 sẽ được sử dụng ngay cả khi có tồn tại
class Foo\Bar\Someclass {…}
4

Tên đủ điều kiện không hoạt động trong khai báo lớp

bạn không thể làm

________số 8

Bạn phải làm

new List_DoublyLinked[];
4

Do giới hạn này, bạn không thể chọn không gian tên thuận tiện nhất khi định nghĩa các lớp, e. g. sử dụng không gian tên cấp cao nhất của dự án cho tất cả các tệp [đối với các tên nhất quán, có thể tìm kiếm được trong tất cả các tệp] hoặc sử dụng không gian tên được sử dụng thường xuyên nhất để giảm số lượng tên cần đặt bí danh/đủ điều kiện

Điều này đặc biệt khó chịu khi di chuyển mã “có khoảng cách tên gạch dưới” hiện có sang không gian tên gốc vì không thể đơn giản thay đổi

class Foo\Bar\Someclass {…}
5 thành
class Foo\Bar\Someclass {…}
6

Các dự án PHP phổ biến lạm dụng không gian tên phụ

Thật không may, nó đã trở thành một quy ước trong PHP để ánh xạ trực tiếp cấu trúc thư mục tới các không gian tên. Đôi khi ngay cả CamelCasing cũng được thay thế bằng các không gian tên [e. g.

class Foo\Bar\Someclass {…}
7 trở thành
class Foo\Bar\Someclass {…}
8] và thậm chí các trường hợp ngoại lệ có không gian tên riêng của họ [e. g.
class Foo\Bar\Someclass {…}
9]

Việc sử dụng hàng trăm không gian tên phụ được lồng sâu với một hoặc hai lớp, mỗi lớp làm cho các hạn chế của tra cứu tên và bí danh trở nên rõ ràng hơn

Không gian tên không thể được tự động tải

“Không gian tên của người nghèo” được thực hiện với các phương thức tĩnh và hằng số lớp có tác dụng phụ tốt khi sử dụng tính năng tự động tải của PHP

Di chuyển sang các hằng số và chức năng được đặt tên tạo ra rủi ro. Các hàm và hằng số được đặt tên thường sẽ hoạt động trong các thử nghiệm đơn vị [xảy ra để tải nhiều tệp và trạng thái đó không bị cô lập giữa các thử nghiệm], nhưng có thể không thành công trong sản xuất khi chỉ có một đường dẫn mã hẹp được thực thi và tệp có liên quan không được tải tự động trong

Phần kết luận

Không gian tên trong PHP 5. 3 không phải là một chiến thắng rõ ràng đối với mã không được đặt tên hoặc "có tiền tố đặt tên". Độ dài của các tên không có tiền tố và độ bền chống va chạm có thể bị lấn át bởi độ dài của các khai báo bí danh và tính dễ vỡ của bản soạn sẵn lặp đi lặp lại. PHP 7 đã khắc phục một số vấn đề, nhưng các vấn đề lớn vẫn chưa được giải quyết

Đối với các khung lớn và đa dạng, bất kỳ không gian tên nào cũng có thể tốt hơn là không có gì, nhưng đối với các dự án được kiểm soát nhiều hơn, các không gian tên PHP có thể không có lợi ở dạng hiện tại của chúng

Phương pháp khả thi

Tôi không nghĩ rằng việc phải sử dụng một IDE nặng phân tích toàn bộ dự án và tự động tạo mã soạn sẵn là giải pháp phù hợp. Tôi hy vọng các cải tiến có thể được thực hiện ở cấp độ ngôn ngữ để giữ cho nó có thể sử dụng được mà không cần hỗ trợ cuộc sống công nghệ cao

Không gian tên trong một ngôn ngữ động và lộn xộn như PHP là một vấn đề khó khăn, vì vậy tôi không khẳng định là có giải pháp hoàn hảo. Có những điều có thể giúp mặc dù

  • Thay đổi tên đủ điều kiện thành một mã thông báo hoặc làm cho ngữ pháp chấp nhận các mã thông báo khác làm tên. Điều này sẽ tạo ra một cách để tránh xung đột với các từ khóa dành riêng cho PHP
  • Mở rộng ngữ pháp ngôn ngữ để cho phép tên đủ điều kiện trong khai báo lớp. Các tham chiếu đến tên lớp nên hoạt động thống nhất. Khai báo lớp và không gian tên phải trực giao
  • Mở rộng
    new List_DoublyLinked[];
    40 để tải các hàm và hằng số khi chúng được tham chiếu qua tên đủ điều kiện. Thật không may, những tên không đủ tiêu chuẩn cần phải duy trì sự kỳ quặc [yêu cầu luôn sử dụng
    new List_DoublyLinked[];
    41 thay vì
    new List_DoublyLinked[];
    42 sẽ không được chấp nhận]

Với tình trạng hiện tại, tôi muốn tránh các không gian tên trong mã của mình - xử lý xung đột một lần ít hiệu quả hơn là xử lý các không gian tên mọi lúc

Chủ Đề