클래스 상수 대 속성 재정의
아래 시나리오에서 클래스 상수가 상속되는 방식과 인스턴스 변수가 다른 이유를 더 잘 이해하고 싶습니다.
<?php
class ParentClass {
const TEST = "ONE";
protected $test = "ONE";
public function showTest(){
echo self::TEST;
echo $this->test;
}
}
class ChildClass extends ParentClass {
const TEST = "TWO";
protected $test = "TWO";
public function myTest(){
echo self::TEST;
echo $this->test;
}
}
$child = new ChildClass();
$child->myTest();
$child->showTest();
산출:
TWO
TWO
ONE
TWO
위 코드에서 ChildClass에는 showTest () 메서드가 없으므로 상속에 의해 ParentClass showTest () 메서드가 사용됩니다. 결과는 메서드가 ParentClass에서 실행되기 때문에 TEST 상수의 ParentClass 버전이 평가되고있는 반면 상속을 통해 ChildClass 컨텍스트 내에서 평가되기 때문에 ChildClass 멤버 변수 $ test가 평가되고 있음을 보여줍니다.
설명서를 읽었지만이 뉘앙스에 대한 언급이 보이지 않는 것 같습니다. 누구든지 나를 위해 빛을 비출 수 있습니까?
self::
Isn't inheritance-aware and always refers to the class it is being executed in. If you are using php5.3+ you might try static::TEST
as static::
is inheritance-aware.
The difference is that static::
uses "late static binding". Find more information here:
http://php.net/manual/en/language.oop5.late-static-bindings.php
Here's a simple test script I wrote:
<?php
class One
{
const TEST = "test1";
function test() { echo static::TEST; }
}
class Two extends One
{
const TEST = "test2";
}
$c = new Two();
$c->test();
output
test2
In PHP, self refers to the class in which the called method or property is defined. So in your case you're calling self
in ChildClass
, so it uses the variable from that class. Then you use self
in ParentClass
, so it wil then refer to the variable in that class.
if you still want the child class to override the const
of the parent class, then adjust the following code in your parent class to this:
public function showTest(){
echo static::TEST;
echo $this->test;
}
Note the static
keyword. This is uses "late static binding". Now you're parent class will call the const of your child class.
참고URL : https://stackoverflow.com/questions/13613594/overriding-class-constants-vs-properties
'code' 카테고리의 다른 글
인터프리터의 메모리에서 생성 된 변수, 함수 등을 삭제하는 방법이 있습니까? (0) | 2020.09.07 |
---|---|
ostringstream을 지우는 방법 (0) | 2020.09.07 |
단위 테스트를 어떻게 단위 테스트합니까? (0) | 2020.09.07 |
패키지 개체 (0) | 2020.09.07 |
패키지 개체 (0) | 2020.09.07 |