함수가 정의 된 위치를 찾는 방법은 무엇입니까?


109

주어진 함수가 정의 된 파일과 줄을 어떻게 알 수 있습니까?

답변:


231

PHP 자체에서도이 작업을 수행 할 수 있습니다.

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

8
팁 : $reflFunc->isInternal() === TRUE의미-> getFileName () 및-> getStartLine ()은 FALSE를 반환합니다.
Bob Stein

이것은 여전히 ​​나를 위해 잘 작동합니다. 함수가 정의되는 곳이 아닌, 함수가 실행되는 곳을 타겟팅하고 싶습니다.
EHerman

2
@EHerman 리플렉션을 사용하여 함수 호출자를 찾을 수 있다고 생각하지 않습니다. PHP 파일이 요청에 따라 포함되는 경향이 있기 때문에 아마도 잘 작동하지 않을 것입니다. 그래서 함수를 호출하는 모든 코드가로드되지 않았을 것입니다.
Tom Haigh

11
클래스 메소드 위해 당신은 사용할 수 있습니다$reflFunc = new ReflectionMethod($this, 'method_name');
라디 Gallay의

3
@EHerman 함수가 호출되는 위치를 찾기 위해 debug_backtrace ()를 살펴볼 수 있습니다.
dotVezz 2014 년

12

그렇게 할 수있는 IDE를 사용하거나 (Eclipse PDT를 권장합니다), Linux의 경우 항상 grep을 사용하거나 wingrep을 사용할 수 있습니다. Linux에서는 다음과 같습니다.

grep -R "function funName" *

프로젝트의 루트 폴더 내에서.


5
더 나은해야합니다 : 그렙 -R "기능 \ sfunName를"*
데이비드

3

Netbeans와 같은 IDE를 사용하는 경우 함수 사용을 CTRL + 클릭하면 파일이 정의한 프로젝트 폴더 내에 있다고 가정하여 정의 된 위치로 이동합니다.

하지만이를 수행하는 코드 나 기능은 없습니다.


Zend Studio에서도 동일하며 Eclipse 용 PDT에서도 작동한다고 가정합니다.
Gordon

@Gordon 나는 이것이가 있어야합니다 생각 "같은 IDE" 어떤 현대적인 IDE ...
feeela

2

"설명 된"이란 "정의 된"을 의미한다고 가정합니다. 이를 위해 이상적으로는이를 수행 할 수있는 적절한 IDE가 필요합니다.


프로젝트를 통해 텍스트 검색이 가능한 Aptana를 사용하고 있습니다. 그러나 그것을 사용하려면 구멍 (매우 큰) 사이트를 프로젝트로 가져와야합니다.
SaltLake 2010

2

다음 은 특정 문자열에 대해 전체 프로젝트 파일 을 스캔 하고 파일이있는 파일과 기본 PHP 만 사용하여 시작하는 문자 위치를 알려주 는 기본 함수입니다 . 이것이 누군가에게 도움이되기를 바랍니다 ...

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

함수가 정의 된 위치를 확인하는 또 다른 방법, 함수를 재정의하려고하면 PHP 오류 시스템은 단순히 함수가 이전에 정의 된 위치를 알려주는 오류를 반환합니다.


1

나는 Tom의 솔루션을 좋아하기 때문에 ReflectionFunction 과 약간 더 많은 트릭을 공유 할 수 있다고 생각 했습니다 (모든 PHP 5에서 작동해야 함).

  • 한 줄로 파일 이름을 인쇄합니다.

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

내부 함수 (예 : _ ) 의 위치는 표시되지 않지만 여전히 아래와 같이 API를 인쇄 할 수 있습니다.

  • 함수의 정의와 매개 변수를 인쇄하려면 :

    print new ReflectionFunction("foo");

    예:

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

0

"Open Function Declaration"기능을 지원하는 IDE가 필요합니다. PHP의 좋은 점은 Eclipse PDT입니다.

함수 정의를 찾으려면 함수 이름을 강조 표시하고 Ctrl 키를 누른 채 이름을 클릭합니다.

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.