PHP의 상수. PHP에서 상수 만들기 - const 및 정의() Php 상수 파일




모두에게 좋은 하루 되세요. Alexey Gulynin이 연락했습니다. 지난 기사에서 우리가 살펴본 PHP의 등가 연산자. 이 글에서 제가 이야기하고 싶은 것은 PHP의 상수. 학교에서는 "PI 번호"나 물리학에서 보편적인 기체 상수(R)와 같은 상수를 자주 접했습니다. 상수는 한 번 정의되고 그들은 더 이상 변하지 않아. 프로그래밍의 상수에도 동일하게 적용됩니다. 상수를 한 번 정의하면 프로그램 코드에서 절대 변경되지 않습니다. 상수는 다양한 수학적 값, 파일 경로일 수 있습니다.

상수는 변수와 어떻게 다른가요?

1) 한 번 정의되면 다른 곳에서는 값을 할당할 수 없습니다.
2) 이를 참조하기 위해 앞에 "$" 기호를 넣을 필요가 없습니다(여기에 마이너스가 있습니다. 이제 텍스트 문자열에서 상수 이름을 사용할 수 없습니다).
상수 "PI"를 인쇄해 보겠습니다.

상수에는 두 가지 유형이 있습니다. 통역사 정의 및 사용자 정의:

인터프리터가 정의한 상수의 예:

1) __FILE__ - 현재 실행 중인 코드가 포함된 파일 이름을 저장하며,
2) PHP_VERSION - PHP 인터프리터 버전,
3) PHP_OS - PHP가 실행되는 운영 체제 버전입니다.

다음 코드를 입력하고 다른 상수가 무엇인지 확인하세요.

자신만의 상수를 정의할 수 있으며 이는 정의 연산자를 사용하여 수행됩니다. 2개의 상수를 정의해 보겠습니다.

"; echo Const2; ?>

이 경우 이러한 상수의 값을 표시합니다.

기본적으로 상수 이름은 대소문자를 구분합니다. 다음과 같이 선택적 세 번째 매개변수를 사용하여 비활성화할 수 있습니다.

"; echo new1; ?>

모든 것이 작동하는 것을 볼 수 있습니다(이전 예에서는 대소문자를 구분하므로 작동하지 않습니다).

상수 이름을 적는 따옴표에 주의하세요. 이것은 꼭 해야 할 일입니다. 또한, 동일한 이름을 가진 상수를 생성할 수 없습니다.

PHP에서는 함수를 사용하여 상수가 존재하는지 여부를 확인할 수 있습니다. 정의됨(상수 이름). 명확히 하기 위해 예를 살펴보겠습니다.

이 예제를 입력하고 무슨 일이 일어나는지 확인하세요.

(PHP 5 >= 5.3.0, PHP 7)

이 질문 목록은 일반적인 질문과 보다 완전한 이해에 유용한 일부 구현 세부 사항의 두 부분으로 나뉩니다.

먼저 일반적인 질문입니다.

  1. 네임스페이스를 사용하지 않는 경우 이 중 어떤 것도 중요한 것으로 간주되어야 합니까?
  2. 네임스페이스에서 내부 클래스 또는 전역 클래스를 어떻게 사용합니까?
  3. 네임스페이스의 클래스 함수나 자체 네임스페이스의 상수를 어떻게 사용합니까?
  4. 어떻게 그런 이름이 있지? \내 이름또는 \이름변환?
  5. 이름처럼 내 이름변환?
  6. 다음과 같은 정규화되지 않은 클래스 이름과 같습니다. 이름변환?
  7. 규정되지 않은 함수 이름이나 다음과 같은 규정되지 않은 상수 이름과 같습니다. 이름변환?

이해하는 데 도움이 되는 일부 네임스페이스 구현 세부 정보입니다.

  1. 가져온 이름은 동일한 파일에 정의된 클래스와 충돌할 수 없습니다.
  2. 연산자를 사용하여 함수나 상수를 가져올 수 없습니다. 사용.
  3. 동적 네임스페이스 이름(따옴표로 묶인 식별자)은 백슬래시 문자를 이스케이프해야 합니다.
  4. 백슬래시를 사용하여 정의되지 않은 상수를 참조할 수 없습니다. 치명적인 오류가 표시됩니다
  5. NULL, TRUE, FALSE, ZEND_THREAD_SAFE 또는 ZEND_DEBUG_BUILD와 같은 특수 상수는 재정의할 수 없습니다.

네임스페이스를 사용하지 않는 경우 이 중 어떤 것도 중요한 것으로 간주되어야 합니까?

아니요. 네임스페이스는 어떤 형식의 기존 코드나 네임스페이스를 포함하지 않고 작성된 코드에는 영향을 주지 않습니다. 원하는 경우 다음과 같은 코드를 작성할 수 있습니다.

예제 #1 네임스페이스 외부의 전역 클래스에 액세스

$a = 새로운 \ stdClass ;
?>

이는 기능적으로 다음과 동일합니다.

예제 #2 네임스페이스 외부의 전역 클래스에 액세스

$a = 새로운 표준클래스;
?>

네임스페이스에서 내부 클래스 또는 전역 클래스를 어떻게 사용합니까?

예제 #3 네임스페이스의 내부 클래스에 액세스

네임스페이스 foo ;
$a = 새로운 \ stdClass ;

함수 테스트(\ArrayObject $type 힌트예제 = null ) ()

$a = \ DirectoryIterator :: CURRENT_AS_FILEINFO ;

// 내부 또는 전역 클래스의 확장
클래스 MyException은\Exception()을 확장합니다.
?>

네임스페이스의 클래스 함수나 자체 네임스페이스의 상수를 어떻게 사용합니까?

예제 #4 네임스페이스의 내부 클래스, 함수 또는 상수에 액세스

네임스페이스 foo ;

클래스 마이클래스()

// 현재 네임스페이스의 클래스를 사용합니다.
함수 테스트(MyClass $type 힌트예제 = null ) ()
// 현재 네임스페이스의 클래스를 사용하는 또 다른 방법
함수 테스트(\foo\MyClass $typehintexample = null)()

// 현재 네임스페이스에서 클래스 확장
클래스 확장은 MyClass()를 확장합니다.

// 전역 함수에 접근
$a = \globalfunc();

// 전역 상수에 접근
$b = \INI_ALL ;
?>

어떻게 그런 이름이 있지? \내 이름또는 \이름변환?

다음으로 시작하는 이름 \ 항상 보이는 대로 변환됩니다. \내 이름- 사실 이건 내 이름, 그리고 \예외- 이것 예외.

예제 #5 절대 이름

네임스페이스 foo ;
$a = 새로운 \ 내 \ 이름 (); // "my\name" 클래스의 인스턴스를 생성합니다.
echo\strlen("안녕"); // "strlen" 함수 호출
$a = \INI_ALL ; // 변수 $a에는 상수 "INI_ALL"의 값이 할당됩니다.
?>

이름처럼 내 이름변환?

백슬래시를 포함하지만 백슬래시로 시작하지 않는 이름(예: 내 이름

나의다른 이름인 경우 이 동의어는 다음에 적용됩니다. 나의 V 내 이름.

내 이름.

예시 #6 전체 이름

네임스페이스 foo ;
foo로 blah \ blah를 사용하십시오.

$a = 새로운 내\이름(); // "foo\my\name" 클래스의 인스턴스를 생성합니다.
foo\bar::이름(); // "blah\blah\bar" 클래스의 정적 메서드 "name"을 호출합니다.
내\바(); // "foo\my\bar" 함수를 호출합니다.
$a = 내\BAR; // 변수 $a에 상수 "foo\my\BAR"의 값을 할당합니다.
?>

다음과 같은 정규화되지 않은 클래스 이름과 같습니다. 이름변환?

백슬래시를 포함하지 않는 클래스 이름(예: 이름두 가지 방법으로 변환할 수 있습니다.

동의어를 생성하는 가져오기 표현식이 있는 경우 이름다른 이름이면 이 동의어가 사용됩니다.

그렇지 않으면 현재 네임스페이스 이름이 다음의 접두사가 됩니다. 내 이름.

예제 #7 정규화되지 않은 클래스 이름

네임스페이스 foo ;
foo로 blah \ blah를 사용하십시오.

$a = 새 이름(); // "foo\name" 클래스의 인스턴스를 생성합니다.
foo::이름(); // "blah\blah" 클래스의 정적 메서드 "name"을 호출합니다.
?>

규정되지 않은 함수 이름이나 다음과 같은 규정되지 않은 상수 이름과 같습니다. 이름변환?

백슬래시를 포함하지 않는 함수 또는 상수의 이름(예: 이름두 가지 방법으로 변환할 수 있습니다.

첫째, 현재 네임스페이스 이름 앞에는 이름.

그런 다음 상수나 함수가 이름전역 상수 또는 함수를 사용하여 현재 네임스페이스에 존재하지 않습니다. 이름, 존재하는 경우.

예제 #8 불완전한 함수 또는 상수 이름

네임스페이스 foo ;
foo로 blah \ blah를 사용하십시오.

const FOO = 1;

함수 my()()
함수 foo()()
함수 정렬 (& $a )
{
\sort($a); // 전역 함수 "sort"를 호출합니다.
$a = array_flip($a);
$a를 반환합니다;
}

나의(); // "foo\my"를 호출합니다.
$a = strlen("안녕"); // "foo\strlen"이 존재하지 않기 때문에 전역 함수 "strlen"을 호출합니다.
$arr = 배열(1, 3, 2);
$b = 정렬($arr); // "foo\sort" 함수를 호출합니다.
$c = foo(); // "foo\foo" 함수 호출 - 가져오기가 적용되지 않음

$a = FOO ; // 변수 $a에 상수 "foo\FOO"의 값을 할당합니다. 가져오기는 적용되지 않습니다.
$b = INI_ALL ; // 변수 $b에 전역 상수 "INI_ALL"의 값을 할당합니다.
?>

가져온 이름은 동일한 파일에 정의된 클래스와 충돌할 수 없습니다.

다음 스크립트 조합이 유효합니다.

네임스페이스 my\stuff;
클래스 마이클래스()
?>

다른 네임스페이스 ;
수업 물건()
?>

네임스페이스 my\stuff;
"file1.php"를 포함합니다;
"another.php"를 포함합니다;


$a = 새로운 MyClass ; // "another" 네임스페이스에서 "thing" 클래스의 인스턴스를 생성합니다.
?>

클래스가 있어도 이름 충돌이 없습니다. 내 수업네임스페이스 내부에 존재 내 물건 MyClass 정의가 별도의 파일에 있기 때문입니다. 그러나 다음 예제에서는 MyClass 클래스가 use 문이 있는 동일한 파일에 정의되어 있으므로 치명적인 이름 충돌 오류가 발생합니다.

네임스페이스 my\stuff;
다른 것을 MyClass로 사용하십시오.
클래스 마이클래스() // 치명적인 오류: MyClass가 가져오기 표현식과 충돌합니다.
$a = 새로운 MyClass ;
?>

중첩된 네임스페이스는 허용되지 않습니다.

PHP는 네임스페이스가 서로 중첩되는 것을 허용하지 않습니다.

네임스페이스 my\stuff(
네임스페이스 중첩(
클래스 foo()
}
}
?>

그러나 다음과 같이 중첩된 네임스페이스를 시뮬레이션하려면 다음을 수행합니다.

네임스페이스 my\stuff\nested(
클래스 foo()
}
?>

PHP 5.6 이전에는 연산자를 사용하여 함수나 상수를 가져올 수 없었습니다. 사용.

PHP 5.6 이전에는 연산자의 영향을 받는 유일한 요소는 다음과 같습니다. 사용네임스페이스와 클래스 이름입니다. 긴 상수 또는 함수 이름을 줄이려면 해당 내용을 네임스페이스로 가져옵니다.

네임스페이스 광산;
매우\긴\ns\이름을 사용하십시오;

$a = 이름 \ 상수;
이름\func();
?>

PHP 5.6부터 함수와 상수 이름에 대한 별칭을 가져오고 생성하는 것이 가능해졌습니다.

동적 네임스페이스 이름(따옴표로 묶인 식별자)은 백슬래시 문자를 이스케이프해야 합니다.

백슬래시는 문자열 내에서 이스케이프 문자로 사용되므로 이를 표현하는 것이 매우 중요합니다. 문자열 내에서 사용될 때는 항상 중복되어야 합니다. 그렇지 않으면 의도하지 않은 결과가 발생할 위험이 있습니다.

예제 #9 큰따옴표로 묶인 문자열 안에 네임스페이스 이름을 사용할 때의 함정

$a = "위험\이름" ; // \n은 큰따옴표로 묶인 문자열 내의 개행 문자입니다!
$obj = 새로운 $a ;

$a = "전혀\위험하지 않음" ; // 여기서는 문제가 없습니다.
$obj = 새로운 $a ;
?>

작은따옴표로 묶인 문자열 내에서는 백슬래시를 구분 기호로 사용하는 것이 더 안전하지만 모든 문자열에서 백슬래시를 이스케이프 처리하는 것이 여전히 모범 사례입니다.

백슬래시를 사용하여 정의되지 않은 상수를 참조할 수 없습니다. 치명적인 오류가 표시됩니다

규정되지 않은 이름인 정의되지 않은 상수(예: , PHP가 다음과 같이 가정했다는 메시지가 표시됩니다. 상수의 값이었습니다. 백슬래시 문자가 포함된 정규화된 이름이나 절대 이름을 가진 상수가 발견되지 않으면 치명적인 오류가 발생합니다.

예제 #10 정의되지 않은 상수

네임스페이스 바 ;
$a = FOO ; // 경고 표시: 정의되지 않은 상수 "FOO"는 "FOO"로 간주됩니다.
$a = \FOO ; // 치명적인 오류: 정의되지 않은 네임스페이스 상수 FOO
$a = 바\FOO; // 치명적인 오류: 정의되지 않은 네임스페이스 상수 bar\Bar\FOO
$a = \바 \FOO ; // 치명적인 오류: 정의되지 않은 네임스페이스 상수 Bar\FOO
?>

NULL, TRUE, FALSE, ZEND_THREAD_SAFE 또는 ZEND_DEBUG_BUILD와 같은 특수 상수는 재정의할 수 없습니다.

특수 내장 상수의 이름과 일치하는 네임스페이스 상수를 정의하려고 하면 치명적인 오류가 발생합니다.

예제 #11 정의되지 않은 상수

네임스페이스 바 ;
const NULL = 0; // 치명적 오류;
const true = "멍청함" ; // 또한 치명적인 오류;
// 등.
?>

7년 전

정의 함수를 사용하고 세 번째 매개변수인 case_insensitive를 false로 설정하여 특수 내장 상수인 네임스페이스 상수를 정의하는 방법이 있습니다.

네임스페이스 foo ;
정의(__NAMESPACE__ . "\NULL" , 10 ); // 현재 네임스페이스에 상수 NULL을 정의합니다.


?>

일반적으로 발생하는 것처럼 정의() 호출에서 네임스페이스를 지정할 필요가 없습니다.
네임스페이스 foo ;
정의(INI_ALL, "바"); // 알림 생성 - 상수 INI_ALL이 이미 정의되어 있습니다. 하지만:

(__NAMESPACE__ . "\INI_ALL" , "bar" )를 정의합니다. // 현재 네임스페이스에 상수 INI_ALL을 정의합니다.
var_dump(INI_ALL); // string(3)"bar"를 표시합니다. 지금까지 확인되지 않은 것은 없습니다. 하지만:

Define("NULL", 10); // 현재 네임스페이스에 상수 NULL을 정의합니다...
var_dump(NULL); // 10을 표시합니다.
var_dump(널); // NULL을 표시합니다.
?>

case_insensitive 매개변수가 true로 설정된 경우
네임스페이스 foo ;
정의(__NAMESPACE__ . "\NULL" , 10 , true ); // 알림 생성 - 상수 null이 이미 정의되어 있음
?>

3 년 전

변수를 사용하여 클래스를 생성하거나 네임스페이스 내에서 정적 메서드를 호출할 때 적절한 클래스를 사용하려면 전체 네임스페이스가 필요하다는 점을 명심해야 합니다. 동일한 네임스페이스 내에서 호출되더라도 별칭이나 짧은 이름을 사용할 수 없습니다. 이를 고려하지 않으면 코드에서 잘못된 클래스를 사용하거나 치명적인 누락 클래스 예외가 발생하거나 오류나 경고가 발생할 수 있습니다.

이러한 경우 매직 상수 __NAMESPACE__를 사용하거나 전체 네임스페이스 및 클래스 이름을 직접 지정할 수 있습니다. class_exists 함수에는 전체 네임스페이스와 클래스 이름도 필요하며 누락된 클래스로 인해 치명적인 오류가 발생하지 않도록 하는 데 사용할 수 있습니다.

네임스페이스 foo ;
클래스 바(
공개 정적 함수 테스트()(
get_called_class()를 반환합니다.
}
}

네임스페이스 Foo\Foo;
클래스 Bar는 \Foo \Bar를 확장합니다(
}

Var_dump(Bar::test()); // 문자열(11) "Foo\Foo\Bar"

$bar = "푸\바" ;
var_dump($bar::test()); // 문자열(7) "Foo\Bar"

$bar = __NAMESPACE__ . "\술집" ;
var_dump($bar::test()); // 문자열(11) "Foo\Foo\Bar"

$bar = "바" ;
var_dump($bar::test()); // 치명적인 오류: 클래스 "Bar"를 찾을 수 없거나 잘못된 클래스 \Bar가 사용되었습니다.

이번 노트에서는 상수에 대해 이야기하겠습니다. 평소와 마찬가지로 프로그래밍 언어에서 상수의 개념을 살펴보고 상수가 어떻게 선언되고 사용되는지 살펴보겠습니다. PHP의 상수.

PHP의 상수 및 상수 개념

상수라는 단어는 수학에서 이미 익숙할 것입니다.

“수학적 상수- 가치가 변하지 않는 양.”

PHP에서도 마찬가지입니다. PHP의 상수코드 실행 중에 변경될 수 없는 단순한 값(문자열, 일부 숫자)을 지정하는 역할을 하는 식별자입니다.

상수를 선언하려면(값을 할당하려면) 다음 함수를 사용하세요. 정의하다. 상수 선언의 예:

PHP의 상수 이름은 대소문자를 구분하므로(대소문자가 다름) 주의해야 합니다. 상수 이름은 항상 대문자로 작성하는 관례도 있습니다.

상수 이름은 문자 또는 밑줄 "_"로 시작해야 하며 문자, 숫자, 밑줄로 구성될 수 있습니다.

상수를 사용하는 간단한 예를 살펴보겠습니다.

이 예에서는 상수를 선언하고 이를 프로그램에서 사용했습니다.

상수는 무엇을 위해 사용되며 변수를 사용하는 것이 더 쉽지 않습니까?

이미 언급했듯이 상수는 프로그램 실행 중에 값을 변경할 수 없습니다. 상수는 일반적으로 데이터베이스 액세스 세부 정보(호스트, 사용자 로그인 및 비밀번호, 데이터베이스 이름), 디스크의 사이트 위치 및 기타 여러 설정과 같은 영구 사이트 매개변수를 저장합니다.

변수를 사용하면 스크립트가 실수로(오류 발생 시) 변수 값을 변경하여 의도한 대로 작동하지 않을 수 있습니다.

상수를 사용하면 상수를 선언할 때 지정한 값이 변경되지 않고 유지됩니다.

PHP에는 프로젝트에 맞게 미리 정의된 특별 상수 및 매직 메소드 세트가 있습니다. Define() 을 사용하여 설정할 수 있는 일반 상수와 달리 미리 정의된 상수의 의미는 사용 위치에 따라 다르며 코드 및 PHP 시스템에 대한 읽기 전용 정보입니다. 특수한 PHP 기능에 액세스하기 위해 클래스에서 매직 메소드를 사용할 수 있습니다.

이 튜토리얼에서는 코드에서의 사용 예와 함께 몇 가지 유용한 사전 정의된 상수 및 매직 메소드를 살펴보겠습니다.

미리 정의된 상수

미리 정의된 상수는 코드에 대한 정보를 얻는 데 사용됩니다. 이러한 상수의 이름은 이중 밑줄 사이에 대문자로 표시됩니다(예: __LINE__ 및 __FILE__ ). 다음은 PHP에서 사용할 수 있는 유용한 미리 정의된 상수입니다:

  • __LINE__은 상수가 사용된 소스 파일의 줄 번호를 반환합니다.

  • __FILE__은 전체 경로를 포함한 파일 이름을 나타냅니다.

  • __DIR__은 파일 경로만 나타냅니다.

  • __CLASS__는 현재 클래스의 이름을 나타냅니다.

  • __FUNCTION__은 현재 함수의 이름을 나타냅니다.

  • __METHOD__는 현재 메서드의 이름을 나타냅니다.

  • __NAMESPACE__는 현재 네임스페이스의 이름을 나타냅니다.

마법의 방법

매직 메소드는 특수 PHP 기능에 대한 후크를 제공합니다. 이름은 __construct() 및 __destruct() 와 같이 앞에 두 개의 밑줄이 있는 소문자로 작성됩니다.

Construct()는 PHP가 클래스의 인스턴스를 생성하기 위해 호출하는 마법의 메서드입니다. 여러 인수를 허용합니다.

Destruct()는 PHP 수집기에 의해 객체가 파괴될 때 호출되는 매직 메서드입니다. 이 메서드는 인수를 사용하지 않으며 일반적으로 데이터베이스 연결 닫기와 같은 특수 작업을 수행하는 데 사용됩니다.

다음 몇 가지 매직 메서드는 속성을 조작하고 PHP가 정의되지 않은(또는 사용할 수 없는) 속성 및 메서드에 대한 호출을 처리하는 방법을 제공하도록 설계되었습니다.

속성이 정의되지 않은(또는 사용할 수 없는) 경우 PHP는 수신 컨텍스트에서 __get() 메서드를 호출합니다. 이 메서드는 속성 이름이라는 하나의 인수를 사용합니다. 속성 값으로 처리될 값을 반환해야 합니다.

__set() 메서드는 설정 컨텍스트의 정의되지 않은 속성에 대해 호출됩니다. 이 메서드는 속성 이름과 값이라는 두 개의 인수를 사용합니다.

myAarray[$prop] = $value; ) 공용 함수 __get($prop) ( return $this->myArray[$prop]; ) 공용 함수 __isset($prop) ( return isset($this->myArray[$prop]); ) 공용 함수 __unset($prop ) ( unset($this->myArray[$prop]); ) 공개 함수 __toString() ( return __CLASS__ . ":" . $this->name; ) ) $obj = new MySample(); if (!isset($obj->name)) ( $obj->name = "Alireza"; ) echo $obj->name; // 알리레자 echo $obj; // MySample: 알리레자

위 코드에서는 클래스에 name 속성이 정의되어 있지 않습니다. 코드는 이 속성을 "Alireza"로 설정하려고 시도하고 PHP는 __set() 매직 메서드를 호출합니다. "name"을 $prop로, "Alireza"를 $value로 사용하고 값을 개인 배열 $myArray에 저장합니다. __get() 메서드도 비슷한 방식으로 작동합니다. $obj->name을 인쇄할 때 __get() 메서드가 호출되고 "name" 값이 $prop 인수로 전달됩니다.

주어진 예에서와 같이 사용할 수 없는 속성을 조작하는 데 도움이 되는 다른 매직 메서드가 있습니다: __isset() , __unset() 및 __toString() . __isset() 및 __unset() 메서드는 모두 동일한 이름을 가진 함수에 의해 실행되지만 PHP에서는 밑줄이 없습니다.

Isset()은 속성이 설정되었는지 여부를 확인합니다. 이 메서드는 확인해야 하는 속성인 하나의 인수를 사용합니다. __unset() 메서드는 재설정할 속성의 이름인 하나의 인수를 사용합니다.

많은 경우, 예를 들어 사용자나 다른 프로세스에 출력하기 위해 객체를 문자열로 표현하는 것이 편리합니다. 일반적으로 PHP는 객체를 메모리 내 식별자로 표현하는데, 이는 이와 같은 기능에는 적합하지 않습니다. __toString() 메서드는 객체를 문자열로 표현하는 데 도움이 됩니다. 이 메서드는 객체가 문자열로 사용되는 다양한 상황에서 실행됩니다(예: echo "Hello $obj" ). 다른 공개 메서드와 마찬가지로 직접 호출할 수도 있습니다.

실행된 각 스크립트에 대해. 이러한 상수 중 다수는 다양한 모듈에 의해 정의되며 해당 모듈이 동적 로딩이나 정적 어셈블리를 통해 사용 가능한 경우에만 존재합니다.

사용되는 상황에 따라 의미가 바뀌는 9개의 마법 상수가 있습니다. 예를 들어, 값 __선__이 상수가 지정되는 스크립트의 줄에 따라 달라집니다. 런타임 시 확인되는 일반 상수와 달리 모든 매직 상수는 컴파일 시 확인됩니다. 특수 상수는 대소문자를 구분하지 않으며 아래에 나열되어 있습니다.

일부 마법의 PHP 상수
이름 설명
__선__ 파일의 현재 줄 번호입니다.
__파일__ 확장된 심볼릭 링크가 포함된 현재 파일의 전체 경로 및 이름입니다. 포함된 파일 내에서 사용되면 이 파일의 이름이 반환됩니다.
__디렉터__ 파일 디렉토리. 포함된 파일 내에서 사용되면 해당 파일의 디렉터리가 반환됩니다. 이는 전화하는 것과 같습니다. 디렉토리 이름(__FILE__). 반환된 디렉터리 이름은 루트 디렉터리를 제외하고 슬래시로 끝나지 않습니다.
__기능__ 함수 이름 또는 (폐쇄)익명 함수의 경우.
__수업__ 수업 이름. 이 이름에는 클래스가 선언된 네임스페이스의 이름이 포함됩니다(예: 푸\바). PHP 5.4부터 __CLASS__는 특성에서도 작동합니다. 특성 메서드에 사용되는 경우 __CLASS__는 메서드가 사용되는 클래스의 이름입니다.
__특성__ 특성 이름. 이 이름에는 특성이 선언된 네임스페이스가 포함됩니다(예: 푸\바).
__방법__ 클래스 메소드의 이름입니다.
__네임스페이스__ 현재 네임스페이스의 이름입니다.
클래스 이름::클래스 전체 클래스 이름(네임스페이스 포함) ::클래스도 참조하세요.

또한보십시오 get_class(), get_object_vars(), 파일이 존재()그리고 함수_존재().

변경사항 목록

14년 전

차이점은 다음과 같습니다.
PHP 5.0.4의 __FUNCTION__ 및 __METHOD__는 다음과 같습니다.

FUNCTION__은 함수 이름만 반환합니다.

__METHOD__는 함수 이름과 함께 클래스 이름을 반환하므로

클래스 트릭
{
함수 doit()
{
에코 __FUNCTION__;
}
함수 doiagain()
{
에코 __METHOD__;
}
}
$obj=새로운 트릭();
$obj->doit();
출력은 ---- doit입니다.
$obj->doitagain();
출력은 ----- 트릭::doitagain 입니다.

12년 전

__CLASS__ 매직 상수는 get_class() 함수를 훌륭하게 보완합니다.

때로는 다음 두 가지를 모두 알아야 할 때도 있습니다.
- 상속받은 클래스의 이름
- 실제로 실행된 클래스 이름

다음은 가능한 솔루션을 보여주는 예입니다.

클래스 기본_클래스
{
함수 say_a()
{

" ;
}

함수 say_b()
{

" ;
}

파생 클래스 클래스는 베이스 클래스를 확장합니다.
{
함수 say_a()
{
부모::say_a();
echo ""a" - 말했다 " . __수업__ . "
" ;
}

함수 say_b()
{
부모::say_b();
echo ""b" - 말했다 " . get_class($this) . "
" ;
}
}

$obj_b = 새로운 파생_클래스();

$obj_b -> say_a();
에코 "
" ;
$obj_b -> say_b();

?>

출력은 대략 다음과 같아야 합니다.

"a" - base_class가 말했습니다.
"a" - 파생 클래스가 말했습니다.

"b" - 파생 클래스가 말했습니다.
"b" - 파생 클래스가 말했습니다.

3 년 전

특성에서 __CLASS__ 및 __METHOD__를 사용할 때 약간의 불일치에 유의하십시오(스탠드 PHP 7.0.4). __CLASS__가 광고된 대로 작동하고 특성이 사용되는 클래스의 이름을 동적으로 반환하는 동안 __METHOD__는 실제로 특성 대신 특성 이름을 추가합니다. 수업 이름!

8 년 전

5.3.0 이전 버전에서는 이전 버전과 호환되는 __DIR__을 구현할 수 있는 방법이 없습니다.

할 수 있는 유일한 일은 재귀 검색을 수행하고 dirname(__FILE__)으로 바꾸는 것입니다.
찾다 . -유형 f -print0 | xargs -0 sed -i "s/__DIR__/dirname(__FILE__)/"

5 년전

여기에는 이 기능을 지원하지 않는 PHP 버전에 대한 __DIR__ 매직 상수 정의와 관련된 많은 참고 사항이 있습니다. 물론 아직 이 상수가 없는 PHP 버전에 대해 이 마법 상수를 정의할 수 있지만 포함된 파일에서 상수를 사용하자마자 그 목적이 무효화됩니다. 이 상수는 __DIR__ 상수를 정의하는 파일과 다른 디렉터리에 있을 수 있습니다. . 따라서 상수는 *마법*을 잃었으며 모든 포함 항목이 동일한 디렉토리에 있다고 확신하지 않는 한 쓸모가 없습니다.

결론: 매직 상수를 정의할 수 있는지 여부에 대한 Gmail 닷컴의 메모는 유효하지만 __DIR__을 정의하는 것은 쓸모가 없다고 언급한 내용은 그렇지 않습니다!

7년 전

매직 상수가 정의되어 있는지 확인할 수 없습니다. 이는 __DIR__이 정의되어 있는지 확인한 다음 정의하는 것이 의미가 없음을 의미합니다. `defined("__DIR__")`는 항상 false를 반환합니다. __DIR__ 정의는 PHP 5.3 이상에서 자동으로 실패합니다. 스크립트에 다른 스크립트가 포함되어 있으면 호환성 문제가 발생할 수 있습니다.

echo (정의됨 ("__DIR__" ) ? "__DIR__이 정의되었습니다" : "__DIR__이 정의되지 않았습니다" . PHP_EOL );
echo (정의됨 ("__FILE__" ) ? "__FILE__이 정의되었습니다" : "__FILE__이 정의되지 않았습니다" . PHP_EOL );
echo (정의됨 ("PHP_VERSION" ) ? "PHP_VERSION이 정의되었습니다" : "PHP_VERSION이 정의되지 않았습니다" ) . PHP_EOL ;
echo "PHP 버전: " . PHP_버전. PHP_EOL ;
?>
산출:
__DIR__이(가) 정의되지 않았습니다.
__FILE__이(가) 정의되지 않았습니다.
PHP_VERSION이 정의되었습니다.
PHP 버전: 5.3.6