php에서 get_defined_constants ()는 정의 된 모든 상수를 포함하는 연관 배열을 반환하는 매우 유용한 기능입니다. 이 기능은 일반적으로 현재 스크립트 실행 중에 모든 상수를 정의하는 데 사용됩니다. 다음과 같은 문제가 발생할 수 있습니다. get_defined_constants ()를 사용할 때 클래스 상수가 반환 결과에 나타나지 않습니다. 그렇다면 왜 이런 일이 일어나고 있습니까? 이 기사에서는이 문제를 깊이 탐색 할 것입니다.
먼저, 우리는 클래스 상수의 개념을 이해해야합니다. PHP에서 클래스 상수는 객체 인스턴스가 아닌 클래스와 관련된 상수입니다. 클래스 상수는 Const 키워드에 의해 정의되며 클래스 내부 및 외부에 액세스 할 수 있지만 해당 범위는 해당 클래스 및 상속 클래스로 제한됩니다. 클래스 상수의 정의의 예는 다음과 같습니다.
class MyClass {
const MY_CONSTANT = 'This is a class constant';
}
echo MyClass::MY_CONSTANT; // 산출:This is a class constant
클래스 상수와 일반적인 수량의 차이점은 일반적인 수량이 전 세계적이지만 클래스 상수는 클래스의 범위와 상속으로 제한된다는 것입니다.
get_defined_constants () 함수는 사전 정의 된 상수와 스크립트에서 정의하는 상수를 포함하여 현재 PHP 스크립트의 모든 정의 된 상수를 반환합니다. 다음과 같이 사용할 수 있습니다.
$constants = get_defined_constants();
print_r($constants);
이것은 모든 상수 이름과 값을 포함하는 연관 배열을 출력합니다.
get_defined_constants () 는 대부분의 상수를 나열 할 수 있지만 클래스 상수를 반환하지는 않습니다. PHP의 상수 시스템은 클래스 상수를 전역 상수가 아닌 클래스의 일부로 취급하기 때문입니다. 따라서 get_defined_constants ()는 기본적으로 전역 상수 만 반환하며 특정 클래스 또는 객체 인스턴스와 관련된 상수를 반환하지 않습니다.
클래스 상수를 얻어야하는 경우 반사 클래스 클래스와 같은 다른 방식으로 클래스 상수에 액세스해야합니다. 다음은 클래스 상수를 얻는 예입니다.
$reflectionClass = new ReflectionClass('MyClass');
$classConstants = $reflectionClass->getConstants();
print_r($classConstants);
이 방법은 MyClass 클래스의 모든 상수를 반환하며 일반적으로 액세스하는 것처럼 액세스 할 수 있습니다.
이것은 PHP의 한계처럼 보일 수 있지만 실제로이 설계는 객체 지향 프로그래밍 (OOP)의 원리를 준수합니다. OOP에서 클래스 상수는 글로벌 범위의 일부가 아닌 특정 클래스에 속합니다. 그들의 범위는 일반적으로 제한되어 있으며 지구 환경의 일부가 아니라 클래스의 정의에 속합니다. 따라서 get_defined_constants () 의 리턴 결과에서 클래스 상수를 제외하면 전역 네임 스페이스를 오염시키고 상수의 범위를 명확하게 유지하는 것입니다.
클래스 상수를 포함한 모든 상수에 액세스 해야하는 경우 다음을 수행 할 수 있습니다.
반사 분류를 사용하여 클래스 상수를 얻으십시오.
$reflectionClass = new ReflectionClass('MyClass');
$classConstants = $reflectionClass->getConstants();
print_r($classConstants);
클래스 상수를 수동으로 수집합니다.
전역 상수와 별도로 클래스 상수를 수동으로 수집하거나 클래스 내부의 클래스 상수를 저장하거나 다른 방식으로 중앙에서 관리 할 수 있습니다.
확장 get_defined_constants () :
get_defined_constants () 와 반사성 클래스를 결합한 사용자 정의 함수를 만들어 클래스 상수를 포함한 모든 상수를 반환 할 수 있습니다.
function get_all_constants() {
$constants = get_defined_constants();
$classes = get_declared_classes();
foreach ($classes as $class) {
$reflectionClass = new ReflectionClass($class);
$constants = array_merge($constants, $reflectionClass->getConstants());
}
return $constants;
}
$allConstants = get_all_constants();
print_r($allConstants);
이 방법은 클래스 상수뿐만 아니라 글로벌 상수를 반환합니다.
클래스 상수는 글로벌 상수가 아닌 클래스의 정의 범위에 속하기 때문에 PHP의 get_defined_constants () 함수는 클래스 상수를 반환하지 않습니다. 클래스 상수에 액세스하려면 ReflectionClass를 통해 얻을 수 있거나 메소드를 사용자 정의하여 클래스 상수를 글로벌 상수로 나열합니다. 이것의 목적은 상수의 범위를 명확하게 유지하고 객체 지향 프로그래밍의 원리를 따르는 것입니다.