Giả sử rằng chúng ta có một biến có tên $title trong phạm vi toàn cầu của tập lệnh PHP. Bên trong một hàm, chúng ta có một biến khác có cùng tên $title và chúng ta gán và thay đổi giá trị của nó trong hàm. Nhưng, biến toàn cầu vẫn không thay đổi. Đây là phạm vi biến. Theo cách tương tự, các lớp có thể được đặt tên để cung cấp cho nó phạm vi
Giải thích 2
Giả sử rằng bạn đang tạo thư viện mã nguồn mở PHP để gửi email và bạn chia sẻ thư viện đó với cộng đồng nhà phát triển. Thư viện của bạn có một lớp tên là Email. Sau đó, một nhà phát triển tải xuống thư viện của bạn. Tuy nhiên, nếu anh ta đã có một lớp tên là Email, Xung đột tên sẽ xảy ra. Bạn sẽ cần đổi tên các lớp đó hoặc sử dụng giải pháp thông minh hơn. không gian tên
Giải thích 3 - Đơn giản nhất
Hai người có thể được đặt tên là "Jack". Chúng ta có thể tách họ theo họ của họ. Theo cách tương tự, hai lớp có thể có cùng tên. Chúng ta có thể tách chúng bằng cách đặt tên
Không gian tên có thể làm gì?
- Không gian tên có thể ngăn xung đột tên
- Không gian tên có thể làm cho mã của chúng tôi có tổ chức hơn
Tại sao không gian tên trong PHP?
Trong PHP, bạn không thể có hai lớp trùng tên. Nếu bạn cần hai lớp để xử lý người dùng blog và người dùng ứng dụng của mình, bạn sẽ cần đặt tên cho những lớp đó. Blog_User và App_User. Nhưng, những tiền tố đó rất khó quản lý
Không gian tên có thể được sử dụng để đơn giản hóa quy trình và làm cho nó có tổ chức hơn. Không gian tên cung cấp cho bạn nhiều quyền kiểm soát hơn
Không gian tên và cấu trúc tệp
Khái niệm xác định và gọi các không gian tên tương tự như cấu trúc tệp thông thường trong hệ điều hành của chúng tôi
Hãy coi không gian tên là thư mục và tệp là lớp
- Thư mục /lib/math có thể có nhiều tệp trong đó, số. php, phép tính. php, v.v. Nhưng, không có nhiều tệp có cùng tên
- Để truy cập số. php từ phép tính. php, bạn có thể tham khảo trực tiếp các số. php
- Thư mục /lib/physics cũng có thể có nhiều tệp, cơ học. php, điện từ. phpvà hơn thế nữa. Ngoài ra, bạn có thể có số. php trong /lib/physics thậm chí nó tồn tại trong thư mục /lib/math
- Bên trong thư mục vật lý, nếu bạn sử dụng số. php trực tiếp, nó sẽ đề cập đến /lib/physics/numbers. php
- Trong thư mục vật lý, nếu bạn cần tham khảo các con số. php tồn tại trong thư mục /lib/math, bạn sẽ cần sử dụng /lib/math/numbers. php
Không gian tên hoạt động theo cùng một cách
Không gian tên toàn cầu
Khi bạn khai báo một lớp [hoặc hàm hoặc hằng số] mà không có không gian tên, nó có thể được gọi là "một mục trong không gian tên chung"
Làm cách nào để xác định không gian tên?
Từ khóa không gian tên theo sau là tên không gian tên được sử dụng để khai báo một không gian tên trong PHP
Tên không gian tên phải là một mã định danh PHP hợp lệ. Khai báo không gian tên phải là điều đầu tiên trong tệp PHP. [ngoại trừ từ khóa khai báo]
Bất kỳ mã PHP hợp lệ nào cũng có thể nằm trong một không gian tên, nhưng chỉ các lớp, giao diện, hằng số và hàm bị ảnh hưởng. Thậm chí có thể có nhiều không gian tên trong cùng một tệp, điều đó không được khuyến nghị
Tạo và truy cập các lớp được đặt tên
Một điều đặc biệt cần nhớ trong suốt hướng dẫn này. PHP luôn liên quan đến không gian tên hiện tại
Nếu chúng ta thêm khai báo không gian tên ở đầu tệp PHP, tất cả các lớp, hàm và hằng số sẽ là các mục của không gian tên đó
tôi có một ý tưởng. Hãy làm chủ các không gian tên PHP. và hãy làm điều đó trong vòng chưa đầy 5 phút. Nhâm nhi một chút cà phê. Đi nào
Gặp gỡ Foo
. một lớp PHP hoàn toàn nhàm chán
dòng 1 - 2class Foo{hàm công khai doAwesomeThings[]{}}
Nói xin chào Foo
. Vui vẻ
dòng 1 - 2class Foo{public function doAwesomeThings[]{echo "Hi Foo. \N";}}
Để khởi tạo lớp mới yêu thích của chúng ta, tôi sẽ chuyển sang một tệp khác và nói - đánh trống - $foo = new Foo[]
dòng 1 - 2 yêu cầu 'Thức ăn. php';$foo = new Foo[];
tada. Chúng ta thậm chí có thể gọi một phương thức trên nó. $foo->doAwesomeThings[]
dòng 1 - 2 yêu cầu 'Thức ăn. php';$foo = new Foo[];$foo->doAwesomeThings[];
nó sẽ làm việc? . Tôi có thể mở một thiết bị đầu cuối và chạy
Ngay bây giờ, Foo
không có không gian tên. Để làm cho Foo
hipster hơn, hãy khắc phục điều đó. Trên lớp, thêm, thế còn, namespace Acme\Tools
dòng 1 - 2namespace Acme\Tools;class Foo{. dòng 7 - 10}
Thông thường không gian tên của một lớp khớp với thư mục của nó, nhưng điều đó không bắt buộc về mặt kỹ thuật. Tôi vừa mới phát minh ra cái này
Xin chúc mừng. Bạn của chúng tôi Foo
hiện đang sống trong một không gian tên. Đặt một lớp trong một không gian tên cũng giống như đặt một tệp trong một thư mục. Để tham khảo nó, hãy sử dụng đường dẫn đầy đủ, dài đến lớp. Acme\Tools\Foo
dòng 1 - 2 yêu cầu 'Thức ăn. php';$foo = new \Acme\Tools\Foo[];. dòng 6 - 8
giống như bạn có thể sử dụng đường dẫn tuyệt đối để tham chiếu tệp trong hệ thống tệp của mình
Khi chúng tôi thử tập lệnh ngay bây giờ
Nó vẫn làm việc
Và. đó thực sự là. Không gian tên về cơ bản là một cách để. làm cho tên lớp của bạn dài hơn. Thêm không gian tên. sau đó tham khảo lớp bằng cách sử dụng không gian tên cộng với tên lớp. Đó là nó
Nhưng mà. có những tên lớp dài này ngay giữa mã của bạn là một điều đáng tiếc. Để khắc phục điều đó, PHP namespaces có thêm một điều đặc biệt. tuyên bố Foo
0. Ở đầu tệp, thêm Foo
1
dòng 1 - 2 yêu cầu 'Thức ăn. php';sử dụng Acme\Tools\Foo làm SomeFooClass;. dòng 6 - 10
Điều này tạo ra một. loại. "đường tắt". Bất kỳ nơi nào khác trong tệp này, bây giờ chúng ta chỉ cần gõ Foo
2
dòng 1 - 2 yêu cầu 'Thức ăn. php';sử dụng Acme\Tools\Foo làm SomeFooClass;$foo = new SomeFooClass[];. dòng 8 - 10
và PHP sẽ biết rằng chúng ta đang thực sự đề cập đến tên lớp dài. Acme\Tools\Foo
Hoặc là. nếu bạn bỏ qua phần Foo
4, PHP sẽ cho rằng bạn muốn bí danh này là Foo
. Đó thường là cách mã trông
dòng 1 - 2 yêu cầu 'Thức ăn. php';sử dụng Acme\Tools\Foo;$foo = new Foo[];. dòng 8 - 10
Vì vậy, không gian tên làm cho tên lớp dài hơn. và câu lệnh Foo
0 cho phép chúng ta tạo lối tắt để chúng ta có thể sử dụng tên "viết tắt" trong mã của mình
Trong mã PHP hiện đại, gần như tất cả các lớp bạn xử lý sẽ nằm trong một không gian tên. ngoại trừ các lớp PHP cốt lõi. Đúng, các lớp PHP cốt lõi không tồn tại trong một không gian tên. điều đó có nghĩa là chúng sống ở không gian tên "gốc" - giống như một tệp ở thư mục gốc của hệ thống tệp của bạn
Hãy chơi với đối tượng Foo
7 cốt lõi. Foo
8 và sau đó là Foo
9 với ngắt dòng
dòng 1 - 8$foo->doAwesomeThings[];$dt = new DateTime[];echo $dt->getTimestamp[]. "\N";
Khi chúng tôi chạy kịch bản
Nó hoạt động hoàn hảo. Nhưng mà. bây giờ hãy chuyển cùng mã đó vào phương thức Foo
0 bên trong người bạn của chúng ta Foo
dòng 1 - 2namespace Acme\Tools;class Foo{public function doAwesomeThings[]{echo "Hi Foo. \n";$dt = new DateTime[];echo $dt->getTimestamp[]. "\N";}}
Bây giờ hãy thử mã
Ah. Nó phát nổ. Và kiểm tra lỗi đó
Không tìm thấy lớp
Foo
2
Tên thật của lớp chỉ nên là Foo
7. Vì vậy, tại sao PHP nghĩ rằng nó là Foo
2? . Foo
sống ở Foo
6. Khi chúng ta chỉ nói Foo
7, điều đó cũng giống như tìm kiếm tệp Foo
7 bên trong thư mục Foo
9
ls DateTime # /acme/tools/DateTime
Có hai cách để khắc phục điều này. Đầu tiên là sử dụng tên lớp "đủ điều kiện". Vì vậy, $foo = new Foo[]
0
dòng 1 - 2namespace Acme\Tools;class Foo{public function doAwesomeThings[]{. dòng 9 - 10$dt = new \DateTime[];. dòng 12}}
Chuẩn rồi. hoạt động giống như một hệ thống tập tin
Hoặc là. bạn có thể sử dụng Foo
7. sau đó loại bỏ $foo = new Foo[]
2 bên dưới
dòng 1 - 2namespace Acme\Tools;use DateTime;class Foo{public function doAwesomeThings[]{. dòng 11 - 12$dt = new DateTime[];. dòng 14}}
Đó thực sự là điều tương tự. không có $foo = new Foo[]
2 ở đầu câu lệnh Foo
0, nhưng bạn nên giả vờ như có. Bí danh này là Foo
7 đến $foo = new Foo[]
0
Và. đã được thực hiện. Không gian tên làm cho tên lớp của bạn dài hơn, sử dụng các câu lệnh cho phép bạn tạo "lối tắt" để bạn có thể sử dụng tên ngắn trong mã của mình và toàn bộ hệ thống hoạt động chính xác như các tệp bên trong thư mục