2011-10-17 39 views
5

Có cách nào để kiểm tra xem lớp học có tồn tại trong một tệp không bao gồm/yêu cầu lớp không?kiểm tra xem lớp học có tồn tại trong tệp mà không yêu cầu/bao gồm

Cái gì như: class_in_file($file);

Như tôi đã đề cập, tôi biết điều này có thể được thực hiện với yêu cầu/bao gồm các lớp và sau đó nhìn lên class_exists($class);, nhưng cách nào khác?

+0

Cũng không .... vì nó vẫn yêu cầu tệp để kiểm tra xem lớp đó có tồn tại trong tệp đó hay không. Nếu không thì sẽ biết nó như thế nào? nếu bạn có class_in_file, nó vẫn cần phải đọc tệp. – Flukey

+2

Nó sẽ giúp mọi người rất nhiều nếu bạn giải thích lý do tại sao bạn nghĩ rằng bạn cần điều này. – CodeCaster

+0

@Jamie Tôi nghĩ anh ấy có nghĩa là 'include' và' require', khác với chỉ đọc tệp. – deceze

Trả lời

9
$tokens = token_get_all(file_get_contents('foo.php')); 

Sau đó, hãy xem mã thông báo để xem bạn có thể phát hiện một mục nhập T_CLASS nhất định hay không.

http://www.php.net/manual/en/function.token-get-all.php
http://www.php.net/manual/en/tokens.php

+0

Tôi đã bỏ lỡ những chức năng đó, chúng rất tuyệt. Cảm ơn thông tin đó hiệu suất – Eineki

+0

khôn ngoan, điều gì sẽ là sự khác biệt với việc bao gồm/yêu cầu tệp? Tôi nghĩ cả hai phương pháp đều phải tải toàn bộ tệp. – olanod

+0

@Dann Hiệu suất khôn ngoan bao gồm tệp sẽ nhanh hơn rất nhiều. Nhưng OP dường như không muốn làm điều đó. – deceze

0

PHP sẽ chỉ biết lớp nào tồn tại nếu nó đã tải (phân tích cú pháp) các tệp mà chúng được định nghĩa trong (giả sử chúng không được tích hợp sẵn). Nếu bạn có một cấu trúc được xác định rõ ràng (có thể bạn đang sử dụng tự động tải), bạn có thể kiểm tra xem một lớp tồn tại chỉ đơn giản bằng cách kiểm tra xem tệp có định nghĩa nó tồn tại hay không. ví dụ. if (file_exists('<path to app>/lib/Myapp/Util/Http.php')) có thể được sử dụng để kiểm tra xem lớp Myapp_Util_Http có tồn tại trong thư mục ứng dụng của bạn hay không. Nó không đảm bảo rằng lớp hiện thực sự tồn tại trong tệp đó. Cho rằng bạn phải bao gồm/yêu cầu nó, đọc nó và phân tích nó, hoặc sử dụng tự động tải và thử sử dụng nó.

2

Tệp php là tệp văn bản, bạn có thể mở tệp đó và phân tích cú pháp để tìm một khai báo lớp .

Nó không phải là một quá trình đơn giản, nhưng một trình phân tích cú pháp tốt nên thực hiện nhiệm vụ tầm thường.

Bạn phải tung ra các dòng nhận xét, các chuỗi có chứa khai báo lớp có thể kích hoạt dương tính giả, heredocs có xu hướng làm mọi thứ phức tạp hơn. Evals cũng nên được xem xét.

nếu bạn có quyền truy cập vào trình thông dịch php dòng lệnh, khi đó bạn có thể xem chuyển đổi -w để xóa nhận xét và khoảng trắng cho bạn làm một nửa số yor phù hợp với bạn.

1

Câu trả lời ngắn gọn là không. Chỉ có cách giải quyết. Ví dụ, bạn có thể phân tích các tập tin bản thân (có lẽ sử dụng token_get_all), hoặc có lẽ đánh dấu các tập tin bằng cách nào đó với một comment ở phía trên như

<?php 
/** #has_class(CLASSNAME) 
*/ 

và đọc vài dòng đầu tiên tìm kiếm này với một preg_match.

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