Không gian tên PHP không hoạt động

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. Người bạn Foo của chúng ta 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ố Foo0. Ở đầu tệp, thêm Foo1

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õ Foo2

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 Foo4, 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 Foo0 cho phép chúng tôi tạo lối tắt để chúng tôi có thể sử dụng tên "ngắn" 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 Foo7 cốt lõi. Foo8 và sau đó là Foo9 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 Foo0 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 Foo2

Tên thật của lớp chỉ nên là Foo7. Vì vậy, tại sao PHP nghĩ rằng nó là Foo2? . Foo sống ở Foo6. Khi chúng ta chỉ nói Foo7, điều đó cũng giống như tìm tệp Foo7 bên trong thư mục Foo9

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 Foo7. sau đó xóa $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 Foo0, nhưng bạn nên giả vờ có. Bí danh này Foo7 đế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

Làm cách nào để bao gồm không gian tên trong PHP?

Khai báo vùng tên .
cú pháp. Khai báo một không gian tên gọi là Html. .
cú pháp. Khai báo một không gian tên có tên là Html bên trong một không gian tên có tên là Code. .
Thí dụ. Sử dụng các lớp từ không gian tên Html. .
Thí dụ. Sử dụng các lớp từ không gian tên Html mà không cần Html\qualifier. .
Thí dụ. Đặt cho một không gian tên một bí danh. .
Thí dụ

Mục đích của không gian tên trong PHP là gì?

Trong thế giới PHP, không gian tên được thiết kế để giải quyết hai vấn đề mà tác giả của các thư viện và ứng dụng gặp phải khi tạo các phần tử mã có thể sử dụng lại như lớp hoặc hàm: Name collisions between code you create, and internal PHP classes/functions/constants or third-party classes/functions/constants.

PHP có hỗ trợ không gian tên không?

Một không gian tên được sử dụng để tránh các định nghĩa xung đột và mang lại sự linh hoạt và tổ chức hơn trong cơ sở mã. Cũng giống như các thư mục, không gian tên có thể chứa một hệ thống phân cấp được gọi là không gian tên con. PHP sử dụng dấu gạch chéo ngược làm dấu tách không gian tên .

Làm cách nào để tự động tải không gian tên trong PHP?

Tự động tải PHP 101. Để tạo trình tải tự động chỉ mất hai bước. Viết hàm tìm các tệp cần đưa vào . Đăng ký hàm đó với hàm PHP lõi spl_autoload_register() .