Không gian tên là gì?


241

Không gian tên PHP là gì?

Không gian tên nói chung là gì?

Một câu trả lời Layman với một ví dụ sẽ là tuyệt vời.

Câu trả lời:


573

Không gian tên làm cho các hàm và các lớp phạm vi nào cho các biến. Nó cho phép bạn sử dụng cùng một chức năng hoặc tên lớp trong các phần khác nhau của cùng một chương trình mà không gây ra xung đột tên.

Nói một cách đơn giản, hãy nghĩ về một không gian tên như họ của một người . Nếu có hai người tên là "John", bạn có thể sử dụng họ của họ để phân biệt họ.

Kịch bản

Giả sử bạn viết một ứng dụng sử dụng hàm có tên output(). output()Hàm của bạn lấy tất cả mã HTML trên trang của bạn và gửi nó cho người dùng.

Sau đó, ứng dụng của bạn trở nên lớn hơn và bạn muốn thêm các tính năng mới. Bạn thêm một thư viện cho phép bạn tạo nguồn cấp RSS. Thư viện này cũng sử dụng một hàm có tên output()để xuất nguồn cấp dữ liệu cuối cùng.

Khi bạn gọi output(), làm thế nào để PHP biết nên sử dụng output()chức năng của bạn hay chức năng của thư viện RSS output()? Nó không. Trừ khi bạn đang sử dụng không gian tên.

Thí dụ

Làm thế nào để chúng ta giải quyết có hai output()chức năng? Đơn giản. Chúng tôi gắn từng output()chức năng trong không gian tên riêng của nó .

Điều đó sẽ trông giống như thế này:

namespace MyProject;

function output() {
    # Output HTML page
    echo 'HTML!';
}

namespace RSSLibrary;

function output(){
    # Output RSS feed
    echo 'RSS!';
}

Sau này khi chúng tôi muốn sử dụng các chức năng khác nhau, chúng tôi sẽ sử dụng:

\MyProject\output();
\RSSLibrary\output();

Hoặc chúng ta có thể tuyên bố rằng chúng ta đang ở một trong các không gian tên và sau đó chúng ta có thể gọi không gian tên đó là output():

namespace MyProject;

output(); # Output HTML page
\RSSLibrary\output();

Không có không gian tên?

Nếu chúng ta không có không gian tên, chúng ta sẽ (có khả năng) thay đổi rất nhiều mã bất cứ khi nào chúng ta thêm thư viện hoặc đưa ra các tiền tố tẻ nhạt để làm cho tên hàm của chúng ta trở nên độc đáo. Với các không gian tên, chúng ta có thể tránh đau đầu khi đặt tên xung đột khi trộn mã của bên thứ ba với các dự án của riêng chúng ta.


Vì một số lý do, tôi nghĩ rằng nếu bạn sử dụng không gian tên trong tệp1 thì bạn sẽ không phải yêu cầu hoặc đưa tệp vào tệp2. Thử nghiệm đơn vị cho thấy rằng đây không phải là trường hợp.
Aaron Bell

1
@AaronBell Bạn có thể muốn kiểm tra tự động tải .
cbednarski

21

Một không gian tên cho phép bạn đặt một loạt mã dưới một tên và không có bất kỳ xung đột đặt tên nào với các lớp, hàm và hằng.

Nó cho phép mã của bạn sống trong không gian tên đó.

PHP sử dụng ký tự hơi gây tranh cãi \ để hiển thị các mức không gian tên. Mọi người đứng dậy trong vòng tay vì nó cũng được sử dụng như một nhân vật trốn thoát.

Để sử dụng không gian tên trong PHP, hãy sử dụng một cái gì đó như thế này ở đầu tệp của bạn.

namespace my\namespace;

Bạn có thể tìm thấy nhiều thông tin hơn về tài liệu PHP chính thức cho các không gian tên .


11

Vì dễ dàng hơn để tìm hiểu về từ khóa, sử dụng mối quan hệ của người dùng bằng cách biết về không gian tên của người dùng, hãy để tôi giải thích không gian tên trước bằng cách xem xét một dự án cơ bản của Laravel.

Có một lớp trình điều khiển có tên: Controller.php nằm trong đường dẫn: app / http / Trình điều khiển từ thư mục gốc của dự án Ngoài ra còn có một lớp trình điều khiển khác có tên: Controller.php , nhưng lớp này nằm trong đường dẫn: nhà cung cấp / laravel / framework / src / Illuminate / Routing từ thư mục gốc của dự án

Bạn không cần phải xem mã nguồn nếu bạn chưa quen với php vì nó có thể làm bạn bối rối, thay vào đó hãy để tôi giải thích cho bạn phần mà chúng tôi quan tâm và sẽ giúp chúng tôi hiểu về cách sử dụng không gian tên Mùi.

Vì vậy, như một vấn đề thực tế, lớp trình điều khiển đầu tiên của chúng tôi: app / http / Controlsers / Controller.php cần sử dụng nhà cung cấp lớp điều khiển thứ hai / laravel / framework / src / Illuminate / Routing / Controller.php . nó thực sự cần phải mở rộng Lớp này để có quyền truy cập vào nội dung của nó để xử lý một số chức năng định tuyến quan trọng.

Vậy làm thế nào một lớp có thể mở rộng một lớp khác có cùng tên? class Controller extends Controller? điều này sẽ KHÔNG hoạt động, trừ khi có một cách để phân biệt hai lớp này và đó là nơi namespacecó ích và usetừ khóa giúp hoàn thành nhiệm vụ, cho phép sử dụng; (các lớp; phương thức; giao diện và hằng số), có cùng tên, trong cùng một phạm vi.

Bây giờ làm thế nào nó được thực hiện trong mã? rất đơn giản! nếu chúng ta nhìn vàomã nguồn app / http / Controlsers / Controller.php , chúng ta có thể thấy ở đầu không gian tên lớp được khai báo là:namespace App\Http\Controllersvì vậy đây là cách bạn cung cấp cho lớp của bạn một không gian tên để bây giờ nó có thể được tham chiếu bởi các lớp khác ngoại hình này giống như đường dẫn đến lớp học này từ thư mục gốc của dự án, với sự khác biệt nhỏ và đó là việc sử dụng “\” thay vì “/ (giống như dấu nhắc lệnh trong cửa sổ) , nhưng có sự khác biệt nhau và đó là App có vốn đầu 'A' trong không gian tên so với 'ứng dụng' với chữ thường 'a' trong đường dẫn. Cũng lưu ý rằng không gian tên là trường hợp nhạy cảm.

Vì vậy, không gian tên là một khái niệm riêng biệt hơn đường dẫn, nó có thể đi theo cấu trúc đường dẫn nếu nó giúp nhưng nó không phải là đường dẫn chính xác đến lớp, phương thức, giao diện hoặc hằng số, ví dụ, hãy xem: nhà cung cấp / laravel / framework /src/Illuminate/Routing/Controll.php mã nguồn,

chúng ta thấy ở đầu lớp không gian tên được khai báo là: Illuminate\Routing

Bây giờ chúng ta hãy xem usetừ khóa của Ăn, chúng tôi sử dụng, usetừ khóa của khăn ăn để làm cho lớp của chúng tôi biết về một lớp hoặc chức năng cụ thể mà chúng tôi muốn sử dụng trong lớp của chúng tôi

vì vậy chúng tôi không nhập hoặc bao gồm bất cứ thứ gì chúng tôi chỉ cho lớp chúng tôi biết rằng chúng tôi sẽ sử dụng một lớp hoặc phương thức cụ thể bằng cách tham chiếu chúng theo không gian tên của chúng, hãy xem mã nguồn của ứng dụng / http / Bộ điều khiển / Bộ điều khiển , như bạn có thể nhìn thấy từ dòng: “ use Illuminate\Routing\Controller as BaseController”, các “ use” từ khóa tiếp theo namespace cho lớp đối tượng (lưu ý rằng Illuminate \ Routing \ Controller.php và Illuminate \ Routing \ khiển 'mà không cần phần mở rộng .php' được hoán đổi)

chúng ta có thể sử dụng astừ khóa (trước đây) cùng với usetừ khóa (một), cung cấp một lớp, phương thức, giao diện hoặc hằng số cụ thể cho phép ứng dụng / http / Bộ điều khiển / Bộ điều khiển.php mở rộng Illuminate \ Routing \ Controller.php làm BaseContoder trong dòng: “ class Controller extends BaseController”.


9

Có các kỹ thuật như không gian tên trong các ngôn ngữ lập trình khác (như các gói trong Java). Chúng được sử dụng để có thể có các lớp đột biến có cùng tên với một dự án.

Từ tài liệu php ( http://www.php.net/manual/en/lingu.namespaces.rationale.php ):

Không gian tên là gì? Trong không gian tên định nghĩa rộng nhất là một cách đóng gói các mục. Đây có thể được coi là một khái niệm trừu tượng ở nhiều nơi. Ví dụ: trong bất kỳ thư mục hệ điều hành nào phục vụ cho các tệp liên quan đến nhóm và hoạt động như một không gian tên cho các tệp trong chúng. Ví dụ cụ thể, tệp foo.txt có thể tồn tại trong cả thư mục / home / greg và in / home / other, nhưng hai bản sao của foo.txt không thể cùng tồn tại trong cùng một thư mục. Ngoài ra, để truy cập tệp foo.txt bên ngoài thư mục / home / greg, chúng ta phải thêm tên thư mục vào tên tệp bằng cách sử dụng dấu tách thư mục để lấy /home/greg/foo.txt. Nguyên tắc tương tự này mở rộng đến các không gian tên trong thế giới lập trình.


1
So sánh với Java là một ý tưởng tồi. Java có các gói và có các lớp khả năng hiển thị gói. Khả năng hiển thị của các thành viên được bảo vệ cũng tùy thuộc vào gói truy cập nó.
Artefacto

1
Chúng không bằng các gói nhưng chúng có chung ý tưởng.
2ndkauboy

Khi câu hỏi cũng hỏi không gian tên nói chung là gì, câu trả lời có ý nghĩa.
kiamlaluno

@kiam Họ chia sẻ một ý tưởng - tên lớp không đụng độ. Họ không chia sẻ ý tưởng về tầm nhìn.
Artefacto

@Artefacto: Kau-Boy không nói không gian tên trong cả hai ngôn ngữ là giống nhau.
kiamlaluno

4

Giống như các thư mụctệp , không gian tên trong PHP phục vụ cho các lớp nhóm , hàm , giao diệnhằng .

Thí dụ:

Filesystem      |   PHP Namespace
----------------|------------------
/Dir/File.txt   |  \Namespace\Class

Nó cung cấp một cách gói các mục từ không gian toàn cầu và cho phép sử dụng tên mục đơn giản mà không gây ra xung đột tên trong một chương trình. Nó được hỗ trợ trong PHP 5.3.0, PHP 7.

Nhưng có một số giới hạn tương tự giữa không gian tên PHP và hệ thống tệp dựa trên Unix:

                          | Filesystem            |        PHP Namespace
--------------------------|-----------------------|-------------------------
Cas sensitive             |       No              |        Yes                
--------------------------|-----------------------|-------------------------
Name with plain number    |       Yes             |        No
--------------------------|-----------------------|-------------------------
Path level                |       Yes             |        Yes   
--------------------------|-----------------------|-------------------------
Plain metacharacters name |       Yes             |        No        

Nguyên tắc mở rộng đến không gian tên trong từ lập trình.


3

Một không gian tên hoạt động như một thư mục. Bạn biết làm thế nào bạn có thể đặt các tập tin trong một thư mục có cùng tên với các tập tin trong thư mục mẹ (hoặc bất kỳ khác)? Chà, một không gian tên cho phép bạn làm điều đó trong một ứng dụng cho các biến, hàm và lớp.

Có một chút xu hướng trong PHP cách đây ít lâu đối với các lớp hàm tĩnh khổng lồ. Cách duy nhất để gọi bất kỳ chức năng nào trong số đó là tiền tố một cuộc gọi với tên lớp. Đây là một nỗ lực nguyên thủy tại các không gian tên, nhưng không có nhiều lợi ích.


2

Một không gian tên về cơ bản cho phép bạn đặt mã vào một thùng chứa. Điều này sẽ ngăn các vấn đề với hai hàm (cũng như các lớp và biến) có cùng tên.

Chúng rất hữu ích khi làm việc khi các ứng dụng lớn hơn để ngăn chặn sự cố với các đoạn mã chia sẻ cùng tên.

Ví dụ: giả sử chúng tôi muốn hai chức năng gọi là "TheMessage". Cả hai sẽ in (echo) tin nhắn khác nhau mỗi. Thông thường, điều này sẽ gây ra lỗi cú pháp, vì bạn không thể có hai hàm có cùng tên.

Để khắc phục điều này, bạn có thể đặt các hàm này vào các không gian tên riêng biệt. Điều này sẽ cho phép bạn sử dụng cả hai chức năng mà không có bất kỳ lỗi nào.


2

Namespace giống như đóng gói nhiều thứ vào một gói duy nhất. Hãy tưởng tượng một không gian tên như một ngăn kéo trong đó bạn có thể đặt tất cả các loại: bút chì, thước kẻ, một mảnh giấy và vv. Để tránh sử dụng các vật phẩm của nhau, bạn quyết định dán nhãn các ngăn kéo để rõ ràng những gì thuộc về ai.


0

Không gian tên được sử dụng để bao quanh nhóm mã để chúng có thể được sử dụng ở những nơi khác nhau mà không có xung đột tên. Hãy nghĩ về điều này vì jQuery không có phương thức xung đột và bạn sẽ hiểu nó tốt hơn.


Bạn có ý nghĩa gì bởi "jQuery không có phương thức xung đột"? Làm thế nào mà liên quan đến PHP?
Nico Haase

0

Một không gian tên là một hệ thống đơn giản để kiểm soát các tên trong một chương trình.
Nó đảm bảo rằng tên là duy nhất và sẽ không dẫn đến bất kỳ xung đột.


Bạn đang nói về loại "tên" nào?
Nico Haase

0

Bạn có thể sử dụng không gian tên để tránh xung đột tên giữa mã bạn tạo và các lớp / hàm / hằng PHP bên trong hoặc các lớp / hàm / hằng của bên thứ ba. Không gian tên cũng có khả năng bí danh (hoặc rút ngắn) Extra_Long_Names được thiết kế để giảm vấn đề đầu tiên, cải thiện khả năng đọc mã nguồn.

Như chúng ta đã biết, không gian tên và đặc điểm không phải là mới trong PHP, nhưng vẫn có nhiều nhà phát triển php không sử dụng các khái niệm tuyệt vời này vì tính phức tạp của chúng. Vì vậy, trong bài viết này. Tôi sẽ cố gắng xóa chúng bằng các ví dụ. Không gian tên và đặc điểm là gì?

Làm thế nào bạn có thể thực hiện chúng trong mã của bạn để làm cho mã của bạn có thể tái sử dụng và mở rộng?

Lợi ích của không gian tên

Bạn có thể sử dụng không gian tên để tránh xung đột tên giữa mã bạn tạo và các lớp / hàm / hằng PHP bên trong hoặc các lớp / hàm / hằng của bên thứ ba.

Không gian tên cũng có khả năng bí danh (hoặc rút ngắn) Extra_Long_Names được thiết kế để giảm vấn đề đầu tiên, cải thiện khả năng đọc mã nguồn. Hãy hiểu không gian tên với một ví dụ. tạo một thư mục tên là php php_oops, trong htdocs (xampp) hoặc www (xwamp) tạo một thư mục mới trong thư mục gốc có tên là tên không gian tên, và sau đó tạo một tệp index.php trong thư mục không gian tên.

<?php
// FilePath:- namespaces/index.php

// let's say, we have two classes in index,
// here, these two classes have global space
class A 
{ 
   function __construct()
   { 
      echo "I am at Global space, Class A";
   }
}
class B
{
   function __construct()
   {
      echo "I am at Global space, Class B";
   }
}
// now create an object of class and 
$object = new A; // unqualified class name
echo "<br/>";
$object = new \B; // fully qualified class name
// output: 
I am at Global space, Class A
I am at Global space, Class B

Tham khảo- https://medium.com/@akgarg007/php-laravel-namespaces-and-traits-01-9540fe2969cb


1
Hãy cẩn thận với việc liên kết đến nội dung của riêng bạn trên các trang web khác nhau, bạn không muốn trở thành người gửi thư rác . Bạn nên bao gồm phần lớn nội dung ở đây và chỉ sử dụng liên kết làm tài liệu tham khảo.
Dharman
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.