Khắc phục sự cố “Câu lệnh sử dụng có tên không phải từ ghép… không có tác dụng”


95

Gặp lỗi này khi tôi đặt use Blog;ở trên cùng.

Cảnh báo: Tuyên bố sử dụng có tên không phải từ ghép 'Blog' không có hiệu lực trong ...

Blog là không gian tên của tôi, trong đó tôi có 3 lớp: Article, List và Category và một vài hàm.

Nếu tôi thay đổi trạng thái của mình thành use Blog\Article;thì nó hoạt động ...

Tôi không thể chỉ định không gian tên mà tôi muốn sử dụng? Tôi có cần cung cấp các lớp học không?

Điều gì sẽ xảy ra nếu tôi có các chức năng trong không gian tên đó? Khi tôi gọi họ bên ngoài không gian tên, tôi buộc phải thêm vào trước \Blog\tên của mỗi người ...


không, tôi không sử dụng bất kỳ khuôn khổ nào
thelolcat

1
Đã xảy ra với tôi khi tôi khai báo hồ sơ của mình namespace sau đó use Blah; .
Derek Illchuk,

Nó cũng có thể có nghĩa là 'Blog' đã được đưa vào và bạn đang cố gắng sử dụng nó lần thứ hai. Điều này thường xảy ra nếu bạn đang sử dụng một khuôn khổ đã bao gồm nó cao hơn trong chuỗi.
Rhu

@DerekIllchuk nếu đây có thể là một câu trả lời mà tôi có thể ủng hộ. Đã cứu tôi rất nhiều đau đầu.
Tôi cố gắng khó khăn như vậy nhưng tôi khóc to hơn

Câu trả lời:


90

PHP usekhông giống như C ++ using namespace; nó cho phép bạn xác định một bí danh , không phải "nhập" một không gian tên và do đó từ đó loại bỏ hoàn toàn bộ định nghĩa không gian tên.

Vì vậy, bạn có thể làm:

use Blog\Article as BA;

... để rút ngắn nó, nhưng bạn không thể loại bỏ nó hoàn toàn.


Do đó, use Bloglà vô ích, nhưng tôi tin rằng bạn có thể viết:

use \ReallyLongNSName as RLNN;

Lưu ý rằng bạn phải sử dụng một hàng đầu \ở đây để buộc trình phân tích cú pháp biết rằng ReallyLongNSNamenó hoàn toàn đủ điều kiện. Điều này không đúng với Blog\Article, rõ ràng đã là một chuỗi không gian tên:

Lưu ý rằng đối với các tên không gian tên ( tên không gian tên đủ điều kiện có chứa dấu phân tách vùng tên, chẳng hạn như Foo\Bar tên toàn cụcFooBar không chứa dấu cách, chẳng hạn như ), dấu gạch chéo ngược ở đầu là không cần thiết và không được khuyến nghị, vì tên nhập phải đủ điều kiện và không được xử lý liên quan đến không gian tên hiện tại.


22
Ah, tệ quá. Vì vậy, usethứ thực sự vô dụng, cũng có thể là một từ viết tắt của điều đó :)
thelolcat

1
@thelolcat: Nó có những công dụng của nó ... không phải là thứ mà bạn muốn. :) Nó không có vẻ như nó có thể là một rào cản khó chịu.
Các cuộc đua ánh sáng ở Orbit vào

7
Câu trả lời này chỉ đúng cho các tệp không có vùng chứa tên. 1) Trong tệp không gian tên, không cần sử dụng dấu đứng đầu trong usecâu lệnh, vì các đối số của nó luôn được coi là tuyệt đối (tức là bắt đầu từ không gian tên chung). 2) use Blog;không nhất thiết là vô dụng: ví dụ: từ một tệp có vị trí đặt tên Blog\Util\CLI, nó sẽ cho phép bạn viết Blog\Entry::method()thay vì \Blog\Entry::method(). Không phải là điều này thực sự cần thiết, nhưng nó có ảnh hưởng. Để biết ví dụ về cách sử dụng này, hãy xem khung Nette.
Zilk

24

Vì câu hỏi này xuất hiện dưới dạng kết quả đầu tiên trên Google cho lỗi này, tôi sẽ nêu cách tôi sửa lỗi.

Về cơ bản nếu bạn có một framework, chẳng hạn như Yii2, bạn sẽ quen với việc phải khai báo các lớp như:

use Yii;
use yii\db\WhatEver;

class AwesomeNewClass extends WhatEver
{
}

Bạn sẽ gặp lỗi Use Yiinày vì lớp này không có không gian tên.

Vì lớp này không có không gian tên nên nó tự động kế thừa bảng ký hiệu chung và do đó không cần những thứ như thế này xác định, chỉ cần loại bỏ nó.


ĐÚNG! Điều này có ý nghĩa! :)
Mārtiņš Briedis

1
Đối với tôi, vấn đề là tôi đang cố gắng sử dụng một biểu tượng từ không gian tên chung, ví dụ: use \Passwordnhưng php không thích nó khi bạn cố gắng làm điều đó mà không có bí danh, vì vậy thậm chí use \Password as Passwordhoạt động tốt.
Kzqai

Bị phản đối vì đề xuất sử dụng OOD khi người kiểm duyệt đang tìm kiếm câu trả lời chung hơn về việc sử dụng không gian tên.
Josh Habdas

1
@JoshH bạn đang làm gì về? Tôi thậm chí không nhận được câu trả lời cuối cùng của bạn. Bạn đã khỏi nói rằng đó không phải là điều mà một số người kiểm duyệt đang tìm kiếm để đưa ra liên kết của một anh chàng nào đó về OOP trolling
Sammaye

1
@JoshH (BTW Tôi ghét điều đó khi mọi người tham khảo các blog có ý kiến ​​như vậy như tài liệu có thẩm quyền để trả lời một câu hỏi)
Sammaye

6

Câu uselệnh trong PHP thực sự chỉ là một sự tiện lợi để biến một không gian tên dài thành một thứ gì đó có thể dễ đọc hơn một chút. Nó không thực sự bao gồm bất kỳ tệp nào hoặc làm bất kỳ điều gì khác, ảnh hưởng đến sự phát triển của bạn, bên cạnh việc cung cấp sự tiện lợi. Vì, Blogkhông phải bí danh là bất cứ điều gì bạn không đạt được bất kỳ sự tiện lợi nào. Tôi có thể tưởng tượng bạn có thể làm điều gì đó như

use \Blog as B;

Và điều đó thậm chí có thể hoạt động. ( Có thể lập luận rằng bạn thực sự mất tiện lợi ở đây bằng cách che khuất nhưng đó không phải là những gì câu hỏi nói về nó ) Bởi vì bạn thực sự đang đặt bí danh Blogkhông gian tên cho một thứ khác. Sử dụng Blog\Articlehoạt động vì, theo tài liệu:

// this is the same as use My\Full\NSname as NSname
use My\Full\NSname;

Vì vậy, đoạn mã của bạn sẽ tương đương với:

use Blog\Article as Article;

1
Vui lòng không bao giờ gọi bất cứ điều gì Btrừ khi bạn đang chủ động viết mã không thể nhầm lẫn hoặc thực sự muốn khiến người khác đau đầu.
Josh Habdas

2

Lỗi "Câu lệnh sử dụng ... không có hiệu lực ..." cũng bật lên nếu bạn cố gắng sử dụng một đặc điểm trước định nghĩa lớp.

use My_trait; // should not be here

class My_class{
// use My_trait; should be here instead
}

2

nếu bạn không muốn sử dụng cú pháp 'as' như

use \Blog as B;

xác định một không gian tên cho tệp

namespace anyname;

use Blog
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.