아래 시나리오에서 클래스 상수가 상속되는 방식과 인스턴스 변수가 다른 이유를 더 잘 이해하고 싶습니다.
<?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::
상속을 인식하지 않고 항상 실행되는 클래스를 참조합니다. php5.3 +를 사용하는 경우 상속 인식 static::TEST
으로 시도 할 수 있습니다 static::
.
차이점은 static::
“지연 정적 바인딩” 을 사용 한다는 것 입니다. 여기에서 자세한 정보를 찾으십시오.
http://php.net/manual/en/language.oop5.late-static-bindings.php
내가 작성한 간단한 테스트 스크립트는 다음과 같습니다.
<?php
class One
{
const TEST = "test1";
function test() { echo static::TEST; }
}
class Two extends One
{
const TEST = "test2";
}
$c = new Two();
$c->test();
산출
test2
답변
PHP에서 self는 호출 된 메서드 또는 속성이 정의 된 클래스를 나타냅니다. 그래서 경우에 당신이 전화하는거야 self
에서 ChildClass
이 클래스에서 변수를 사용하므로. 그런 다음 self
in 을 사용 ParentClass
하므로 해당 클래스의 변수를 참조합니다.
그래도 자식 클래스가 부모 클래스를 재정의하도록 const
하려면 부모 클래스의 다음 코드를 이에 맞게 조정합니다.
public function showTest(){
echo static::TEST;
echo $this->test;
}
static
키워드에 유의하십시오 . 이것은 “지연 정적 바인딩”을 사용합니다. 이제 부모 클래스가 자식 클래스의 const를 호출합니다.