Làm thế nào để tìm ra nơi một hàm được định nghĩa?


109

Làm cách nào tôi có thể tìm ra tệp và dòng nào một hàm đã cho đã được định nghĩa?

Câu trả lời:


231

Bạn cũng có thể làm điều này bằng chính PHP:

$reflFunc = new ReflectionFunction('function_name');
print $reflFunc->getFileName() . ':' . $reflFunc->getStartLine();

8
Mẹo: $reflFunc->isInternal() === TRUEcó nghĩa là -> getFileName () và -> getStartLine () sẽ trả về FALSE.
Bob Stein

Điều này vẫn hoạt động tốt đối với tôi. Tôi muốn nhắm mục tiêu đến nơi hàm đang được kích hoạt, thay vì từ nơi nó được xác định.
EHerman

2
@EHerman Tôi không nghĩ rằng bạn có thể tìm thấy người gọi hàm có phản xạ. Nếu bạn có thể, nó có thể sẽ không hoạt động tốt cho việc này vì các tệp PHP có xu hướng được đưa vào theo yêu cầu và vì vậy bạn có thể sẽ không tải tất cả mã gọi hàm.
Tom Haigh

11
Đối với phương pháp Class bạn có thể sử dụng$reflFunc = new ReflectionMethod($this, 'method_name');
Ladislav Gallay

3
@EHerman bạn có thể xem xét debug_backtrace () để tìm vị trí một hàm đang được gọi.
dotVezz

12

Hoặc sử dụng một IDE cho phép làm như vậy (tôi khuyên bạn nên sử dụng Eclipse PDT), hoặc bạn có thể liên kết nó nếu trên Linux hoặc sử dụng wingrep. Trong Linux, nó sẽ giống như sau:

grep -R "function funName" *

từ trong thư mục gốc của dự án.


5
tốt hơn nên có: grep -R "function \ sfunName" *
David

3

Nếu bạn sử dụng một IDE như Netbeans, bạn có thể CTRL + Nhấp vào sử dụng hàm và nó sẽ đưa bạn đến nơi nó được xác định, giả sử tệp nằm trong thư mục dự án bạn đã xác định.

Không có mã hoặc chức năng để làm điều này mặc dù.


Tương tự trong Zend Studio và tôi cho rằng điều này cũng sẽ hoạt động với PDT cho Eclipse.
Gordon

@Gordon "một IDE như" Tôi nghĩ đây là điều bắt buộc phải có đối với bất kỳ IDE hiện đại nào ...
feeela

2

Tôi giả định rằng bằng cách "mô tả" bạn có nghĩa là "được xác định". Đối với điều này, lý tưởng là bạn cần một IDE phù hợp để có thể làm được.


Tôi đang sử dụng Aptana có chức năng tìm kiếm văn bản thông qua dự án. Nhưng để sử dụng nó, tôi cần nhập trang web lỗ (rất lớn) làm dự án.
SaltLake

2

Đây là một chức năng cơ bản sẽ quét toàn bộ tệp dự án của bạn để tìm một chuỗi cụ thể và cho bạn biết tệp đó nằm ở đâu và vị trí ký tự nào mà nó bắt đầu khi chỉ sử dụng php cơ bản. Hy vọng điều này sẽ giúp ai đó ...

<?php 
$find="somefunction()";

echo findString('./ProjectFolderOrPath/',$find);

function findString($path,$find){
    $return='';
    ob_start();
    if ($handle = opendir($path)) {
        while (false !== ($file = readdir($handle))) {
            if ($file != "." && $file != "..") {
                if(is_dir($path.'/'.$file)){
                    $sub=findString($path.'/'.$file,$find);
                    if(isset($sub)){
                        echo $sub.PHP_EOL;
                    }
                }else{
                    $ext=substr(strtolower($file),-3);
                    if($ext=='php'){
                        $filesource=file_get_contents($path.'/'.$file);
                        $pos = strpos($filesource, $find);
                        if ($pos === false) {
                            continue;
                        } else {
                            echo "The string '$find' was found in the file '$path/$file and exists at position $pos<br />";
                        }
                    }else{
                        continue;
                    }
                }
            }
        }
        closedir($handle);
    }
    $return = ob_get_contents();
    ob_end_clean();
    return $return;
}
?>

2

một cách khác để kiểm tra xem hàm được xác định ở đâu, hãy thử xác định lại hàm, hệ thống lỗi PHP sẽ chỉ trả về một lỗi cho bạn biết nơi hàm đã xác định trước đó


1

Tôi thích giải pháp của Tom, vì vậy tôi nghĩ tôi có thể chia sẻ thêm một chút thủ thuật với ReflectionFunction (nó sẽ hoạt động trên mọi PHP 5):

  • một lớp lót để in tên tệp:

    print (new ReflectionFunction("foo"))->getFileName();

Xin lưu ý rằng nó sẽ không hiển thị cho bạn vị trí cho các hàm nội bộ (chẳng hạn như _ ), nhưng nó vẫn có thể in API cho nó như bên dưới.

  • để in định nghĩa và các tham số của hàm:

    print new ReflectionFunction("foo");

    Thí dụ:

    $ php -r 'print new ReflectionFunction("_");'
    Function [ <internal:gettext> function _ ] {
      - Parameters [1] {
        Parameter #0 [ <required> $msgid ]
      }
    }

0

Bạn sẽ cần một IDE hỗ trợ chức năng "Khai báo hàm mở". Tốt cho php là Eclipse PDT.

Để tìm định nghĩa hàm, đánh dấu tên hàm, giữ CTRL + Bấm vào tên.

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.