Tìm tệp PHP (tại thời điểm chạy) nơi một lớp đã được xác định


111

Có bất kỳ sự phản chiếu / nội quan / ma thuật nào trong PHP sẽ cho phép bạn tìm thấy tệp PHP nơi một lớp (hoặc hàm) cụ thể được xác định không?

Nói cách khác, tôi có tên của một lớp PHP, hoặc một đối tượng được khởi tạo. Tôi muốn chuyển điều này cho một cái gì đó (hàm, lớp Reflection, v.v.) sẽ trả về đường dẫn hệ thống tệp nơi lớp được xác định.

/path/to/class/definition.php

Tôi nhận ra rằng tôi có thể sử dụng ( get_included_files())để lấy danh sách tất cả các tệp đã được đưa vào cho đến nay và sau đó phân tích cú pháp tất cả chúng theo cách thủ công, nhưng đó là rất nhiều quyền truy cập hệ thống tệp cho một lần thử.

Tôi cũng nhận ra rằng tôi có thể viết một số mã bổ sung trong cơ chế __autoload của chúng tôi để lưu trữ thông tin này ở đâu đó. Tuy nhiên, việc sửa đổi __autoload hiện có là không có giới hạn trong tình huống tôi nghĩ.

Nghe về các tiện ích mở rộng có thể làm được điều này sẽ rất thú vị, nhưng cuối cùng tôi muốn thứ gì đó có thể chạy trên cài đặt "cổ phiếu".


2
Magento đã đưa tôi đến đây: -]
Alan

@alan tốt để xem một số chính tả tên tài sản ở đó.
Alan Storm

Câu trả lời:


225

Thử ReflectionClass

Thí dụ:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

Điều này sẽ trả về falsekhi không thể tìm thấy tên tệp, ví dụ như trên các lớp gốc.


10

Đối với ReflectionClass trong tệp có không gian tên , hãy thêm tiền tố "\" để làm cho nó toàn cục như sau:

$ Reflection = new \ ReflectionClass ('FOO');

Hoặc nếu không, nó sẽ tạo ra lỗi ReflectionClass cho biết trong một không gian tên không được xác định. Tôi không có quyền bình luận cho câu trả lời trên, vì vậy tôi viết đây như một câu trả lời bổ sung.


0

nếu bạn có một thư mục bao gồm, bạn có thể chạy lệnh shell script tới "grep" cho "class $ className" bằng cách thực hiện: $filename = ``grep -r "class $className" $includesFolder/*\và nó sẽ trả về tệp đó nằm trong. Ngoài ra, tôi không nghĩ rằng có bất kỳ điều kỳ diệu nào cho PHP để làm điều đó cho bạn.


3
Trung thực, tò mò không lỗ ở đây. Điều gì khiến bạn nghĩ câu trả lời này tốt hơn bất kỳ ý tưởng nào mà tôi đã xem xét và bác bỏ? "Tôi nhận ra rằng mình có thể sử dụng (get_included_files ()) để lấy danh sách tất cả các tệp đã được đưa vào cho đến nay và sau đó phân tích cú pháp tất cả chúng theo cách thủ công, nhưng đó là rất nhiều quyền truy cập hệ thống tệp cho một lần thử."
Alan Storm

bởi vì một dòng của nó trái ngược với tuy nhiên nhiều dòng để viết một trình phân tích cú pháp trong PHP và hàm grep được biên dịch C, tôi nghĩ, và có thể nhanh hơn nhiều so với bất cứ thứ gì đã được viết.
Seaux

À, hiểu rồi. Mối quan tâm thực sự của tôi là việc truy cập đĩa lặp đi lặp lại vào từng tệp để thực hiện việc này (đó là điều sẽ xảy ra rất nhiều trong công cụ tôi đang xây dựng) chứ không phải số lượng mã mà tôi sẽ cố gắng làm rõ hơn điều đó tiếp theo thời gian. (FYI: Bạn nên nhìn vào ack. Nó tốt hơn cách tốt hơn là grep!)
Alan Storm

ack hay awk? Tôi yêu awk, trên thực tế ngôn ngữ lập trình fav của tôi của nó, nhưng nhiều người sử dụng grep thường xuyên ... của nó "sạch" cho các công cụ đơn giản này
Seaux

Không phải vậy, ack: betterthangrep.com Đó là sự thay thế perl back grep được tối ưu hóa cho các dự án dựa trên mã tìm kiếm. Thật tuyệt vời.
Alan Storm
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.