PHP의 클래스, 함수 및 인수 구문 분석
-
06-07-2019 - |
문제
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();
}
}
다른 팁
다음 절차를 제안합니다.
- 현재 출력을 저장
get_declared_classes
,get_declared_interfaces
그리고get_defined_functions
(정말로 지원해야 한다면) - 파일을 포함
- 비교하다
get_declared_classes
,get_declared_interfaces
그리고 get_defined_functions
새로운 내용을 확인하기 위해 저장한 항목으로 - 반사를 사용하여 분석
- 다음 파일을 위해 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)
거기에서 좀 더 자세히 알아볼 수 있습니다.그리고 처음 요청한 내용에 도달합니다 ;-)
참고로:내가 전혀 모르는 한 가지가 있습니다."주어진 파일에 어떤 클래스/메소드가 선언되어 있는지 찾는 방법" :-(
누구든지 아이디어가 있다면 환영합니다!