문제

PHP 파일에 대한 경로를 보유하는 단일 인수를 받은 다음 주어진 파일을 구문 분석하고 다음과 같은 것을 반환하는 함수를 만들고 싶습니다.

class NameOfTheClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

abstract class AnotherClass
   function Method1($arg1, $arg2, $arg2)
   private function Method2($arg1, $arg2, $arg2)
   public function Method2($arg1, $arg2, $arg2)

function SomeFunction($arg1, $arg2, $arg3)

이 함수는 정의된 모든 식별자(추상, 공개, 비공개, 보호, 정적, 확장, 인터페이스 등)와 함께 지정된 파일에 존재하는 모든 클래스, 메서드 및 함수를 반환해야 합니다.

내가 처음으로 고민한 것은 정규식을 사용하여 이를 수행하는 것이었지만, 이는 주석과 함께 매우 나쁘게 작동합니다. 즉:/* 이 함수는 return(max(salary)) */ 범위를 적절하게 지원하려면 상당히 복잡해집니다.

또 다른 가능한 해결책은 다음과 같은 내장 PHP 함수를 사용하는 것입니다.

get_declared_classes
get_declared_interfaces
get_defined_functions
get_class_methods

그러나 이러한 함수를 사용하면 클래스/메서드/함수가 정의된 파일을 볼 수 없으므로 그다지 유용하지 않습니다.

나는 Tokenizer 확장이 내 문제에 대한 해결책이라고 생각하지만 이전에는 이 확장을 사용해 본 적이 없습니다.

도움이 되었습니까?

해결책

PHP 5를 사용하는 경우 리플렉션 API 당신의 도구입니다.

예:

$class = new ReflectionClass("NameOfTheClass");
$methods = $class->getMethods();
foreach($methods as $m) {
    print $m->name;
    $m->isPrivate() ? print "Private" : print "";
    $m->isPublic() ? print "Public" : print "";
    $params = $m->getParameters();
    foreach($params as $p) {
        print $p->getName();
        }
}

다른 팁

다음 절차를 제안합니다.

  1. 현재 출력을 저장 get_declared_classes, get_declared_interfaces 그리고 get_defined_functions(정말로 지원해야 한다면)
  2. 파일을 포함
  3. 비교하다 get_declared_classes, get_declared_interfaces 그리고 get_defined_functions 새로운 내용을 확인하기 위해 저장한 항목으로
  4. 반사를 사용하여 분석
  5. 다음 파일을 위해 2단계로 이동

당신이 스스로 알아낸 것처럼, 정규 표현식은 작업에 적합한 도구가 아닙니다. ^^

그리고 당신이 말했듯이 당신이 제안한 내장 함수도 그다지 도움이 되지 않습니다. 단지 도움이 될 수 있는 것은 어떤 클래스가 존재하는지 알 수 있다는 것입니다...하지만 내장 클래스도 반환합니다. :-(

Tokenizer 확장 기능을 사용하는 것은 나에게는 다소 과도하거나 어려운 것 같습니다.나는 아마도 실제로 그런 식으로 가지 않을 것입니다.너무 "낮은 수준"인 것 같아요.


대신, 나는 PHP의 리플렉션 API :클래스, 인터페이스, 함수 등을 리버스 엔지니어링하기 위해 존재합니다.

그래서, 나는 그것이 당신이 하려는 일에 매우 적합할 것이라고 생각합니다.


편집하다 :다음은 간단한 예입니다.

먼저, 수업에 대해 생각해 봅시다:

include dirname(__FILE__) . '/temp-2.php';
$rC = new ReflectionClass('MyFirstClass');

이제 선언된 파일과 그 안에 어떤 메서드가 있는지 확인할 수 있습니다.

var_dump($rC->getFileName());
var_dump($rC->getMethods());

당신을 얻을 것입니다 :

string '/home/squale/developpement/tests/temp/temp-2.php' (length=48)

array
  0 => &
    object(ReflectionMethod)[2]
      public 'name' => string '__construct' (length=11)
      public 'class' => string 'MyFirstClass' (length=12)
  1 => &
    object(ReflectionMethod)[3]
      public 'name' => string 'glop' (length=4)
      public 'class' => string 'MyFirstClass' (length=12)


이제 각 방법에 대한 정보를 얻으려면 다음을 수행하십시오.

foreach ($rC->getMethods() as $rM) {
    var_dump($rM, $rM->getParameters());
    echo '-----';
}

당신은 얻을 것이다 :

object(ReflectionMethod)[3]
  public 'name' => string '__construct' (length=11)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[4]
      public 'name' => string 'arg1' (length=4)
  1 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'arg2' (length=4)

-----

object(ReflectionMethod)[2]
  public 'name' => string 'glop' (length=4)
  public 'class' => string 'MyFirstClass' (length=12)

array
  0 => &
    object(ReflectionParameter)[5]
      public 'name' => string 'a' (length=1)


거기에서 좀 더 자세히 알아볼 수 있습니다.그리고 처음 요청한 내용에 도달합니다 ;-)


참고로:내가 전혀 모르는 한 가지가 있습니다."주어진 파일에 어떤 클래스/메소드가 선언되어 있는지 찾는 방법" :-(

누구든지 아이디어가 있다면 환영합니다!

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top