Ưu và nhược điểm của không gian tên so với bao gồm / yêu cầu trong PHP?


20

Gần đây tôi đã bắt đầu sử dụng các không gian tên trong PHP. Khi tôi lần đầu tiên nhìn thấy chúng, tôi đã nghĩ rằng cú pháp của chúng thật xấu và tôi không bao giờ sử dụng chúng. Tuy nhiên, tôi đã tạo một trình tải tự động (spl_autoload_register) để nó không bao giờ phải viết một câu lệnh bao gồm / yêu cầu nữa.

Tôi thích các không gian tên, nhưng có bất kỳ lợi ích khách quan nào trong việc bao gồm / yêu cầu các câu lệnh, hay chúng có phải là cùng một phương thức để thực hiện cùng một mục tiêu không?


1
Không gian tên ngăn chặn va chạm với thư viện của bên thứ ba.
Phản ứng

1
Ngay bây giờ lợi ích chính đối với tôi liên quan đến không gian tên là tự động tải. Chẳng hạn, tôi sử dụng nội tuyến new \Vendor\Namespace\Class()mà không có câu lệnh yêu cầu trước đó trong phương thức hoặc lớp.
NobleUplift

3
Nhiều thư viện PHP sử dụng tự động tải mà không có không gian tên. PHP nên đặt không gian tên bắt buộc.
Phản ứng

Không có tranh luận từ tôi. Tôi muốn thấy tất cả những thay đổi được liệt kê ở đây .
NobleUplift

Câu trả lời:


21

Không gian tên không chỉ dành cho các lớp tự động tải. Họ cũng ngăn chặn xung đột đặt tên. Trên thực tế, đó là mục đích chính của họ.

Giả sử bạn có một dự án cần một lớp có tên User, để lưu trữ thông tin về người dùng ứng dụng của bạn, nhưng một plugin cũng sử dụng một lớp (khác) có tên Userđể lưu trữ thông tin. Không gian tên cho phép bạn tạo lớp của mình trong một không gian tên (giả sử MyApp) và cho phép plugin sử dụng một không gian tên khác (giả sử CoolPlugin). Mã trong MyAppkhông gian chỉ có thể tham chiếu User(ví dụ new User();:) và vì vậy có thể mã trong CoolPluginkhông gian; mỗi người sẽ nhận được kết quả mong đợi. Khi bạn cần sử dụng mã từ một không gian tên khác , bạn chỉ cần thêm tiền tố vào nó. Ví dụ, mã trong CoolPluginkhông gian có thể truy cập Userlớp MyAppquanew \MyApp\User();

Thay thế là mỗi lớp cần một tên phức tạp ở mọi nơi , chẳng hạn như class MyApp_Userclass CoolPlugin_User. Không gian tên cho phép bạn đơn giản hóa mọi thứ hầu hết thời gian và tránh đặt tên xung đột mọi lúc.

Chỉnh sửa: Để trả lời câu hỏi, "Có sự khác biệt về hiệu suất giữa hai người không?"

Không phải là một ý nghĩa, không. Tôi đã không điểm chuẩn nó, nhưng có lẽ có một sự khác biệt ở cấp độ nano giây. Điều đó nói rằng, hy sinh chất lượng mã cho các tinh chỉnh hiệu suất siêu nhỏ không phải là một chiến lược tốt, vì vậy bạn nên sử dụng không gian tên bất kể. Để biết điểm chuẩn của các loại vấn đề tương tự, hãy xem PHPbench.comcâu trả lời StackOverflow này .

Mã của bạn cần phải cực kỳ chặt chẽ và cực kỳ nhạy cảm với thời gian (nghĩ rằng giao dịch tần số cao hoặc quản lý các phản ứng hạt nhân) trước khi bạn cần lo lắng về việc tối ưu hóa vi mô trong bối cảnh này. Nếu nó thực sự nhạy cảm với thời gian, có lẽ bạn nên mã hóa bằng hoặc thậm chí là , không được giải thích các ngôn ngữ như PHP.


1
+1 Tôi chỉ đơn giản lưu ý rằng mọi dự án bắt đầu dường như không thể cần không gian tên, và sau đó dễ dàng phát triển đến mức trở nên lố bịch khi hack xung quanh mọi thứ để hoạt động mà không có chúng. Không có không gian tên về cơ bản giống như khai báo mọi biến toàn cục, như được áp dụng cho các lớp. Trên các cơ sở mã lớn hơn hoặc các cơ sở sử dụng tự do các thư viện, nó trở thành một mớ hỗn độn.
BrianH

1
Xin vui lòng xem chỉnh sửa của tôi ở trên.
elixenide 16/12/13

2
Tôi có đề cập đến việc tôi đang tạo giao diện PHP cho Máy Va chạm Hadron Lớn không? Nếu không, tôi tin rằng câu trả lời này là đủ, cảm ơn bạn.
NobleUplift

1
Xin đừng tạo ra bất kỳ ngôi sao quark hoặc lỗ đen! Vui mừng được giúp đỡ.
elixenide

1
Đừng lo lắng, chỉ có siết cổ. Chúng tôi đang tạo ra đại bác hadron - Ý tôi là, một cái gì đó nghiêm túc và không vũ khí.
NobleUplift 17/12/13
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.