클래스가 정의 된 PHP 파일 찾기 (런타임에)


111

PHP에 특정 클래스 (또는 함수)가 정의 된 PHP 파일을 찾을 수있는 반사 / 내관 / 마법이 있습니까?

즉, PHP 클래스 또는 인스턴스화 된 개체의 이름이 있습니다. 클래스가 정의 된 파일 시스템 경로를 반환하는 무언가 (함수, Reflection 클래스 등)에 이것을 전달하고 싶습니다 .

/path/to/class/definition.php

( get_included_files())지금까지 포함 된 모든 파일의 목록을 가져온 다음 모두 수동으로 구문 분석하는 데 사용할 수 있지만 한 번의 시도에 대한 많은 파일 시스템 액세스입니다.

또한이 정보를 어딘가에 캐시하는 __autoload 메커니즘에 추가 코드를 작성할 수 있다는 것도 알고 있습니다. 그러나 기존 __autoload를 수정하는 것은 내가 염두에 둔 상황에서 제한이 없습니다.

이를 수행 할 수있는 확장 프로그램에 대해 듣는 것은 흥미로울 것이지만 궁극적으로 "스톡"설치에서 실행할 수있는 무언가를 원합니다.


2
마 젠토 날 여기를 가져왔다 : -]
앨런

@alan 거기에 속성 이름 철자를 보니 반갑습니다.
Alan Storm

답변:


225

시험 ReflectionClass

예:

class Foo {}
$reflector = new \ReflectionClass('Foo');
echo $reflector->getFileName();

false파일 이름을 찾을 수없는 경우 (예 : 네이티브 클래스에서) 반환 됩니다.


10

네임 스페이스 파일의 ReflectionClass의 경우 접두사 "\"를 추가하여 다음과 같이 전역으로 만듭니다.

$ reflector = new \ ReflectionClass ( 'FOO');

그렇지 않으면 정의되지 않은 네임 스페이스에 ReflectionClass라는 오류가 발생합니다. 나는 위의 답변에 대해 의견을 말할 권리가 없었기 때문에 보충 답변으로 작성합니다.


0

포함 폴더가있는 경우 다음을 수행하여 "class $ className"에 대해 "grep"에 대한 쉘 스크립트 명령을 실행할 수 있습니다. $filename = ``grep -r "class $className" $includesFolder/*\그러면 어떤 파일에 있었는지 반환합니다. 그 외에는 마법이 없다고 생각합니다. PHP가 나중에 할 수있는 함수입니다.


3
여기에 정직하고 멍청하지 않은 호기심. 이 답변이 내가 이미 고려하고 거부 한 아이디어보다 더 낫다고 생각하게 만든 이유는 무엇입니까? "(get_included_files ())를 사용하여 지금까지 포함 된 모든 파일의 목록을 가져온 다음 모두 수동으로 구문 분석 할 수 있다는 것을 알고 있습니다. 그러나 이는 한 번의 시도로 많은 파일 시스템 액세스입니다."
Alan Storm

PHP로 파서를 작성하는 데 필요한 많은 라인과 반대되는 한 라인이기 때문에 grep 함수는 C로 컴파일되고 작성되었을 것보다 훨씬 빠릅니다.
Seaux 2010 년

아, 알았어. 내 실제 관심사는이 작업을 수행하기 위해 각 파일에 대한 반복적 인 디스크 액세스였으며 (내가 빌드하는 도구에서 많이 발생할 것입니다) 다음에 더 명확하게 만들려고 시도 할 코드의 양이 아닙니다. 시각. (참고 : ack를 조사해야합니다. grep보다 훨씬 낫습니다!)
Alan Storm

ack 또는 awk? 저는 awk를 좋아합니다. 실제로 제가 가장 좋아하는 프로그래밍 언어입니다.하지만 더 많은 사람들이 grep을 정기적으로 사용합니다.이 간단한 작업에는 "cleaner"가 있습니다
Seaux

Not awk, ack : betterthangrep.com 검색 코드 기반 프로젝트에 최적화 된 펄 백 grep 대체입니다. 훌륭합니다.
Alan Storm
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.