우리는 종종 대규모 프로젝트를 개발하거나 PHP를 사용하여 레거시 시스템을 유지할 때 다양한 사전 정의 된 상수를 만듭니다. 프레임 워크, 라이브러리 또는 구성 파일에 의해 설정 될 수 있으며, 코드를 디버그하거나 리팩토링 할 때 혼란스러워하며 이러한 상수가 어디에 정의되는지 알고 싶어합니다.
PHP는 현재 스크립트에 정의 된 모든 상수를 나열하는 내장 기능 get_defined_constants () 를 제공합니다. 그러나 불행히도 상수가 정의되는 파일 또는 줄을 직접 알려주는 것은 아닙니다. 이 기사는 get_defined_constants ()를 사용하여 특정 상수의 소스를 신속하게 찾는 데 도움이되는 간단한 간접 기술을 소개합니다.
get_defined_constants () 모든 현재 상수의 이름과 값이 포함 된 배열을 반환합니다.
print_r(get_defined_constants());
출력 결과는 비슷합니다.
Array
(
[E_ERROR] => 1
[E_WARNING] => 2
[MY_CUSTOM_CONSTANT] => abc123
...
)
그러나 이것은 "추적 성"의 요구를 충족시킬 수 없습니다.
"차이 비교"라는 아이디어를 사용하여 상수가 정의되는 파일을 분석 할 수 있습니다.
상수 스냅 샷 기록 A : 대상 파일을 포함하기 전에 한 번 get_defined_constants () 호출하십시오.
객체 파일 포함 : 요구 또는 포함을 통해 상수를 정의했다고 의심하는 파일로드.
상수 스냅 샷 B를 기록하십시오 . 포함 후, get_defined_constants ()를 다시 호출하십시오.
차이 분석 : 스냅 샷 A와 B의 차이점을 비교하면이 파일에 어떤 상수가 소개되었는지 알 수 있습니다.
다음은 전체 예입니다.
<?php
// 첫 번째 단계:초기 상수 목록을 기록하십시오
$before = get_defined_constants();
// 2 단계:당신이 의심하는 문서를 소개하십시오
require_once 'https://m66.net/includes/config.php';
// 3 단계:가져온 상수 목록을 기록하십시오
$after = get_defined_constants();
// 4 단계:새로 도입 된 상수를 분석하십시오
$newConstants = array_diff_assoc($after, $before);
echo "새로 정의 된 상수는입니다:\n";
print_r($newConstants);
이 코드를 실행하면 config.php 에서 새로운 상수가 정의되는 것을 볼 수 있습니다. "정의 라인 번호"를 직접 얻을 수는 없지만이 파일이 이러한 상수를 소개한다고 명확하게 언급 할 수 있습니다.
상수가 파일에 정의되어 있음을 확인한 경우, 정의 된 위치로 정확하게 점프하기 위해 편집기 또는 IDE (예 : PHPStorm)의 "글로벌 검색"기능의 도움으로 define ( 'my_constant' '라는 단어를 더 검색 할 수 있습니다.
또한 Xdebug와 같은 디버거는 중단 점을 설정 한 후 실시간으로 상수 등록을 모니터링 할 수 있지만보다 고급 사용 범주에 속하며이 기사는 당분간 확장되지 않습니다.
get_defined_constants ()는 "전후 상태 비교"의 도움으로 "어떤 줄에 대한 상수를 정의한 사람"을 직접 알 수 없지만 상수의 소스 파일을 신속하게 결정할 수 있습니다. 이 기술은 특히 다음에 적합합니다.
신비한 상수의 원천을 해결합니다
외부 라이브러리가 도입 한 글로벌 오염을 분석하십시오
자동 테스트에서 일정한 누출을 모니터링합니다
이 아이디어를 일반적인 디버깅 도구로 캡슐화하고 비슷한 문제를 겪을 때 신속하게 배치하고 노력의 절반으로 두 배를 달성 할 수 있습니다.