2011-12-16 22 views
5

Tôi muốn lấy tên của tất cả các lớp trong một không gian tên cụ thể trong PHP. Hiện tại, tôi đang cố gắng thực hiện một số phép thuật thông qua sự phản chiếu trên một danh sách cụ thể của các lớp được đặt tên, nhưng tôi muốn làm điều đó mà không biết tên trước.Trong PHP, có cách nào để có được tất cả các lớp được khai báo trong một không gian tên cụ thể không?

Tôi đã thử gọi get_declared_classes(), nhưng vì bất kỳ lý do nào, các lớp học mà tôi có sẵn không hiển thị. Tôi có thể gọi get_declared_classes(), không thấy Event trong danh sách, sau đó gọi ngay $x = new Event() mà không gặp sự cố. Một cái gì đó như sau, mà tôi nghĩ rằng sẽ gây ra một vấn đề ...

if (! in_array('Event', get_declared_classes())) { $x = new Event(); } 

... hoạt động tốt. Tôi tự hỏi nếu không gian tên các lớp này và lấy cách đó sẽ giúp giảm bớt vấn đề. Điều này có thể không?

EDIT: Để làm rõ, hãy để tôi thêm rằng tôi hiện không sử dụng không gian tên và tôi không cố gắng đạt được điều gì đó từ mã được liệt kê ở trên. Những gì tôi muốn là để có được tên của tất cả các lớp tôi đã tuyên bố. Mặc dù thực tế, các khai báo lớp cho tất cả chúng đều bị tấn công trước khi tôi gọi get_declared_classes(), chúng không phải tất cả đều xuất hiện trong danh sách. Tôi đã hy vọng rằng không gian tên có thể giúp giải quyết vấn đề.

EDIT2: Một số người đã chỉ ra rằng các lớp học có thể được tự động tải. Tôi đã thử nghiệm điều này bằng cách làm như sau. echo(class_exists('Event')) trả về giá trị 1. echo(class_exists('Event', FALSE)) trả về giá trị 0. Tham số thứ hai, tùy chọn cho class_exists là có hay không tự động tải. Vì vậy, rõ ràng là lớp đang được tự động tải. Điều đó trả lời điều đó.

Vì vậy, câu hỏi tiếp theo - làm cách nào để ngăn chặn điều này? Tôi đang sử dụng một khung công tác thực sự không cung cấp cho tôi nhiều quyền kiểm soát ở mức độ thấp. Có cách nào để buộc tải tự động, THEN gọi số get_declared_classes hoặc để get_declared_classes kích hoạt tự động tải trước không?

+1

Trong trường hợp này trong đó get_declared_classes không chứa Sự kiện, có mã Sự kiện đã được tải không? Nói cách khác, có tệp chứa khai báo lớp của sự kiện đã được bao gồm (hoặc được định nghĩa khác trong luồng mã đã) chưa? – Corbin

+1

Tôi havent bothered để kiểm tra nhưng tôi sẽ nghĩ rằng điều này có thể là do youve tham chiếu một NS với một tuyên bố sử dụng và tên lớp trong mảng sẽ là hoàn toàn đủ điều kiện với không gian tên. Vì vậy, trong khi 'sự kiện mới' có thể hoạt động thực sự tham chiếu' \ Some \ OtherNamespace \ Event'. – prodigitalson

+0

@Corbin Mã sự kiện chắc chắn được tải. Nếu không, '$ x = new Event()' sẽ thất bại, phải không? – rybosome

Trả lời

5

Bạn không cần phải cứng mã nó trong các mã, bạn có thể sử dụng tên biến:

$class_name = 'Event'; 
if (!in_array($class_name, get_declared_classes())) { 
    $x = new $class_name(); 
}; 

Xem mã tương tự như trong hành động ở đây: codepad.org/hCLE4ToA.

Một số lớp có thể không xuất hiện trong kết quả của get_declared_classes(), vì chúng có thể không được tải tại thời điểm chức năng này được gọi. Có thể là trường hợp nếu chúng được tự động tải sau khi bạn cố gắng khởi tạo chúng. Xem thêm về các lớp tự động tải tại đây: php.net/autoload.

Ứng dụng có trả lời một số câu hỏi của bạn không? Nó có giúp gì không?

+0

Tôi không thực sự cố gắng làm ví dụ mà tôi đã liệt kê.Đó là minh chứng rõ ràng hơn về tên lớp mà tôi muốn không xuất hiện trong danh sách như tôi mong đợi, nhưng nó có sẵn để khởi tạo. – rybosome

+1

@Ryan: Bạn có chắc chắn rằng nó có sẵn cho instantiation không phải vì nó được autoloaded khi bạn cố gắng để nhanh chóng nó? Nói cách khác: bạn có chắc là class đã được định nghĩa trước khi bạn gọi là 'get_declared_classes()'? – Tadeck

+0

Bạn đã chính xác, tự động tải là thủ phạm. – rybosome

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