2014-07-07 16 views
8

sự khác biệt chính giữa hai dòng sau ?: là gìLàm thế nào để sử dụng các đối tượng từ không gian tên khác và làm thế nào để nhập khẩu không gian tên trong PHP

$obj = new ArrayObject(); 

&

$obj = new \ArrayObject(); 

Khi tôi sử dụng dòng đầu tiên tôi gặp lỗi: "Fatal error: Class '\Foo\Bar\ArrayObject' not found..." và tôi không chắc chắn vì sao tôi gặp lỗi này? Dòng thứ hai dường như đã khắc phục được sự cố.

Trả lời

18

Nếu bạn sử dụng:

$obj = new ArrayObject(); 

nó có nghĩa là ArrayObject được định nghĩa trong namespace hiện hành. Bạn có thể sử dụng cú pháp này khi bạn đang ở trong không gian tên chung (không có vùng tên được xác định trong phạm vi hiện tại) hoặc nếu ArrayObject được định nghĩa trong cùng một không gian tên như phạm vi hiện tại (ví dụ Foo\Bar).

Và nếu bạn sử dụng:

$obj = new \ArrayObject(); 

nó có nghĩa là ArrayObject được định nghĩa trong namespace toàn cầu.

Trong ví dụ của bạn, bạn có thể có mã như trong hình:

namespace Foo\Bar; 

$obj = new ArrayObject(); 

Nó sẽ không làm việc vì bạn chưa xác định ArrayObject trong Foo\Bar namespace.

Đoạn mã trên là giống như:

namespace Foo\Bar; 

$obj = new \Foo\Bar\ArrayObject(); 

Và nếu ArrayObject được định nghĩa trong namespace toàn cục (như có thể trong trường hợp của bạn), bạn cần phải sử dụng mã:

namespace Foo\Bar; 

$obj = new \ArrayObject(); 

để giọng đó ArrayObject không phải là được xác định trong không gian tên Foo\Bar;

Một điều nữa - nếu bạn sử dụng ArrayObject ở nhiều nơi trong không gian tên hiện tại của bạn, có thể sẽ không thuận tiện khi thêm mỗi lần gạch chéo ngược hàng đầu. Đó là lý do tại sao bạn có thể nhập không gian tên, do đó bạn có thể sử dụng cú pháp dễ dàng hơn:

namespace Foo\Bar; 

use ArrayObject; 

$obj = new ArrayObject(); 

Như bạn thấy use ArrayObject; đã được bổ sung trước khi tạo đối tượng nhập khẩu ArrayObject từ namespace toàn cầu. Sử dụng use bạn không cần phải thêm (và bạn không nên) thêm hàng đầu xuyệc ngược tuy nhiên nó hoạt động giống như nó đã use \ArrayObject; để mã ở trên là tương đương logic để:

namespace Foo\Bar; 

use \ArrayObject; 

$obj = new ArrayObject(); 
tuy nhiên

như tôi đã nói xuyệc ngược hàng đầu trong không nên sử dụng các không gian tên nhập. Trích dẫn sử dụng PHP cho điều đó:

Note that for namespaced names (fully qualified namespace names containing namespace separator, such as Foo\Bar as opposed to global names that do not, such as FooBar), the leading backslash is unnecessary and not recommended, as import names must be fully qualified, and are not processed relative to the current namespace.

Các vấn đề liên quan