2011-08-11 34 views
44

Tôi có thể lập trình lấy mã chức năng theo tên của nó không?tạo lại/lấy mã của hàm php

Giống như:

function blah($a, $b) { return $a*$b; } 
echo getFunctionCode("blah"); 

là nó có thể?

Có bất kỳ chức năng tự mô tả php nào để tạo lại mã chức năng/lớp không?
(có nghĩa là thay vì nhận được mã nguồn ngay từ tập tin nguồn)

Trong Java có tồn tại: http://java.sun.com/developer/technicalArticles/ALT/Reflection/

Trong PHP:
get_class_methods()
typeof
ReflectionFunction (nhờ Alin Purcaru)

+3

tại sao những downvotes? –

+2

Không hoàn toàn chắc chắn tại sao câu hỏi này bị bỏ phiếu. Tôi thấy nó khá thú vị. –

+1

@Marek, Martin Có lẽ vì nhận xét ** rất thô lỗ mà Marek để lại cho Jules ngây thơ trả lời. –

Trả lời

61

Mở rộng trên những gợi ý để sử dụng ReflectionFunction, bạn có thể sử dụng một cái gì đó như thế này:

$func = new ReflectionFunction('myfunction'); 
$filename = $func->getFileName(); 
$start_line = $func->getStartLine() - 1; // it's actually - 1, otherwise you wont get the function() block 
$end_line = $func->getEndLine(); 
$length = $end_line - $start_line; 

$source = file($filename); 
$body = implode("", array_slice($source, $start_line, $length)); 
print_r($body); 
+4

Erm ... Đó không phải là "mở rộng". Đó là "triển khai". –

+1

Phải, tôi muốn chỉ ra rằng có các hàm trả về tên tệp và các dòng nguồn cụ thể (ví dụ: không phân tích cú pháp), nhưng đề cập đến "mở rộng" vì bạn đã chỉ ra các lớp phản chiếu. Như bạn đã chỉ ra, API kém tài liệu, vì vậy mã tạo điều kiện này. –

+0

@MarekSebera của nó không phải về whos đầu tiên, của nó về câu trả lời bạn sử dụng, cho hồ sơ – Ascherer

17

Không có bất cứ điều gì sẽ cung cấp cho bạn mã thực tế của hàm. Điều duy nhất gần đó có sẵn là lớp học ReflectionFunction. Đối với các lớp học, bạn có ReflectionClass cung cấp cho bạn các thành viên của lớp (hằng số, biến và phương thức) và khả năng hiển thị của chúng, nhưng vẫn không có mã thực.


Cách giải quyết (nó không liên quan đến việc đọc các tập tin nguồn):
Sử dụng ReflectionFunction::export để tìm ra tên tập tin và khoảng cách dòng mà hàm được khai báo, sau đó đọc nội dung từ tập tin đó trên các đường dây. Sử dụng xử lý chuỗi để nhận nội dung giữa số { đầu tiên và số } cuối cùng.

Lưu ý: API phản ánh không được ghi nhận tài liệu.

+0

giải pháp tốt, tôi sẽ chỉ dành một chút thời gian cho những người dùng khác tham gia trước khi kiểm tra câu trả lời của bạn như được chấp nhận –

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