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?
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
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
@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