>  기사  >  백엔드 개발  >  PHP 클래스의 개인 속성 상속 문제 분석

PHP 클래스의 개인 속성 상속 문제 분석

高洛峰
高洛峰원래의
2016-12-01 11:46:171073검색

상위 클래스에 비공개 속성이 있는 경우 이 문장을 주의 깊게 읽어보세요. 그런 다음 상위 클래스의 메서드는 상위 클래스의 전용 속성만 제공합니다.
다음은 이해를 돕기 위한 일련의 예제입니다.
이 예제는 이상해 보입니다. $sal 속성이 하위 클래스에서 재정의되었지만 시스템은 상위 클래스의 속성을 반환합니다.
코드 복사
class Employees{
private $sal=3000;//protected $sal=3000
public function getSal( ){
return $this->sal;
}
}
class Manager 확장 직원 {
protected $sal=5000;

공개 함수 getParentSal()
//여기에 반환되는 것은 상위 클래스의 비공개 속성입니다.
return parent::getSal()
}
}
$manager = new Manager(); >echo ".phpversion()."
";
echo $manager->getSal()
echo "부모의 $sal" .$manager-> getParentSal();
?>

프로그램 실행 결과:
코드 복사
PHP 5.3.8
3000
parent's $sal 3000

상위 클래스의 속성이 하위 클래스에 의해 재정의되는 경우. 결과는 이것입니다. 5행의 속성 정의는 보호됩니다.
코드 복사
class Employees{
//private $sal=3000
protected $sal=3000
public function getSal( ){
return $this->sal;
}
}

클래스 관리자가 직원을 확장합니다. {
protected $sal=5000;

공개 함수 getParentSal (){
//여기서 반환되는 것은 상위 클래스의 비공개 속성입니다.
return parent::getSal()
}
}
$manager = new Manager() ;
echo " PHP ".phpversion()."
"
echo $manager->getSal()
echo "부모의"; $sal ".$manager ->getParentSal();

?>

프로그램 실행 결과:
코드 복사 코드는 다음과 같습니다.
PHP 5.3.8
5000
부모의 $ sal 5000

첫 번째 열에 있는 부모 클래스의 비공개 $sal은 다시 작성되지 않았으므로 부모 클래스의 $manager->getSal() 메서드가 호출됩니다. 이때 부모 클래스의 전용 속성인 $sal은 메모리에 두 개의 $sal이 있습니다
두 번째 열에서는 부모 클래스의 보호된 $sal이 $manager->getSal() 이 메서드입니다. 부모 클래스는 재정의된 $sal을 호출합니다. 이때 부모 클래스의 $sal은 메모리에 존재하지 않습니다.
세 번째 예를 살펴보겠습니다
하위 클래스에서 재정의된 메서드는 현재 비공개에 유효합니다.
코드 복사
class Employees{
private $sal=3000
public function getSal(){
return $this-> sal;
}
}

클래스 관리자 확장 직원 {
private $sal=5000
//재정의된 메서드
public function getSal(){
return $this->sal;
}
public function getParentSal(){
//여기서 반환되는 것은 상위 클래스의 비공개 속성입니다.
return parent::getSal(); 🎜>}
}
$manager = new Manager();
echo "PHP ".phpversion()."
"
echo $manager->getSal();
echo "
";
echo "parent's $sal ".$manager->getParentSal()
?>

실행 결과
코드 복사 코드는 다음과 같습니다:
PHP 5.3.8
5000
부모의 $sal 3000

이 예에서 하위 클래스는 getSal() 메서드를 재정의하여 하위 클래스의 속성을 호출합니다. 🎜>하위 클래스에 주석을 달면
//private $sal=5000;
오류가 발생합니다. 주의 사항: 정의되지 않은 속성: Manager::$sal in E:wampwwwoo2-52-5 -3.php on line 14
line 12에서 하위 클래스 rewrite 메서드를 주석 처리하면 echo $manager->getSal()의 결과는 상위 클래스 $sal 3000의 전용 속성입니다.

zend 디버깅 상태를 열어 메모리 상황을 확인하세요. 맨 아래에 $sal이 2개 있다는 점에 유의하세요. 각각 3000과 5000입니다.
코드 복사
class Employees{
private $sal=3000
public function getSal(){
return $this-> sal;
}
}
클래스 관리자 확장 직원 {
protected $sal=5000;
public function getParentSal(){
return $this->sal; }
}
$manager = new Manager();
echo "PHP ".phpversion()."
"
echo $manager->getSal(); >?> ;

프로그램 실행 결과:
코드 복사 코드는 다음과 같습니다.
PHP 5.3.8
3000

상위 클래스의 $sal 속성을 protected로 변경하고 하위 클래스가 상위 클래스의 속성을 재정의합니다. 메모리에는 $sal이 하나만 있습니다.
코드 복사
class Employees{
protected $sal=3000
public function getSal(){
return $this-> sal;
}
}
클래스 관리자 확장 직원 {
protected $sal=5000;
public function getParentSal(){
return $this->sal; }
}
$manager = new Manager();
echo "PHP ".phpversion()."
"
echo $manager->getSal(); >
?>

프로그램 실행 결과:
코드 복사 코드는 다음과 같습니다.
PHP 5.3.8
5000

Java를 배웠다면 , 당신은 이 모든 것을 느낄 것입니다. 모두 이해하기 매우 어렵습니다.
Java에서는 하위 클래스가 생성되면 상위 클래스의 속성과 메서드가 메모리에 생성되고 생성자까지 호출됩니다.
이것은 PHP5의 경우가 아닙니다. PHP5는 parent-> 대신 parent::를 사용하여 상위 클래스를 호출합니다. 이는 PHP5가 메모리에 상위 클래스가 생성되는 것을 원하지 않는다는 것을 보여주기에 충분합니다. PHP5는 Java보다 상속을 더 간단하게 만들고 싶어합니다.
익숙해지세요.

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.