PHP 프로젝트 개발에서 우리는 종종 정의 또는 const를 사용하여 상수를 정의합니다. 프로젝트가 계속 확장됨에 따라 상수의 수도 극적으로 증가 할 것입니다. 시간이 지남에 따라 일부 상수는 잊혀지고 더 이상 코드에 의해 참조되지 않을 수 있습니다. 이러한 미사용 상수는 유지 보수 비용을 증가시키고 코드 가독성 및 유지 관리 가능성을 줄입니다. 코드 품질을 향상시키기 위해 정적 분석 방법과 결합 된 get_defined_constants 함수를 사용하여 사용되지 않은 상수를 식별하고 청소할 수 있습니다.
get_defined_constants 는 PHP의 내장 함수 중 하나이며, 현재 스크립트 (사용자 정의 상수 및 PHP 내부 상수 포함)에서 정의 된 모든 상수를 반환하는 데 사용됩니다. 이 함수는 부울 매개 변수를 허용 할 수 있으며, 매개 변수가 참 이면 분류별로 그룹화 된 다차원 배열을 반환합니다. 그렇지 않으면 평평한 배열을 반환합니다.
예:
print_r(get_defined_constants(true));
get_defined_constants는 상수가 사용되는지 직접 알려주지 않습니다. 그러나 우리는 다음 두 단계를 결합 하여이 목표를 간접적으로 달성 할 수 있습니다.
모든 사용자 정의 상수 이름을 가져옵니다.
프로젝트 코드를 반복하고 이러한 상수가 참조되는지 확인하십시오.
표시되지 않은 상수를 "사용하지 않은"것으로 표시합니다.
다음은 중소형 프로젝트를 유지하고 있다고 가정하는 간단한 구현 아이디어입니다.
$allConstants = get_defined_constants(true);
$userConstants = isset($allConstants['user']) ? $allConstants['user'] : [];
$projectDir = __DIR__ . '/src'; // 프로젝트 소스 코드 디렉토리
$usedConstants = [];
$files = new RecursiveIteratorIterator(new RecursiveDirectoryIterator($projectDir));
foreach ($files as $file) {
if ($file->isFile() && pathinfo($file, PATHINFO_EXTENSION) === 'php') {
$content = file_get_contents($file->getPathname());
foreach ($userConstants as $name => $value) {
// 간단한 문자열 검색,정기적 인 일치 정확도를 사용할 수도 있습니다
if (strpos($content, $name) !== false) {
$usedConstants[$name] = true;
}
}
}
}
$unusedConstants = array_diff_key($userConstants, $usedConstants);
echo "사용하지 않는 상수 목록:\n";
print_r(array_keys($unusedConstants));
대규모 프로젝트의 경우 변수 이름이 상수 이름과 유사 할 때 간섭과 같은 잘못 판단을 피하기 위해 정규식을 사용하는 것이 좋습니다.
다중 검증을 위해 코드 정적 분석 도구 (예 : PHPSTAN, PSALM)와 협력하는 것이 좋습니다.
상수를 제거하기 전에 개발 환경에서 반복적으로 테스트하여 동적으로 참조되는 실수 상수를 피하는 것이 좋습니다.
프로젝트가 다음 상수를 정의한다고 가정합니다.
define('API_URL', 'https://m66.net/api/');
define('DEBUG_MODE', true);
define('UNUSED_CONST', 12345);
스크립트 분석 후, UNUSED_CONST는 프로젝트에서 참조되지 않으므로 프로젝트 코드의 깔끔함을 향상시키기 위해 코드에서 제거하는 것을 고려할 수 있습니다.
PHP에는 사용되지 않는 상수를 직접 찾을 수있는 내장 기능이 없지만 get_defined_constants 기능과 간단한 코드 스캔 로직을 통해이를 달성 할 수 있습니다. 상수의 합리적인 관리는 코드 가독성과 유지 관리를 향상시키는 데 도움이되며 프로젝트의 성숙도와 표준화를 반영합니다.