>  기사  >  백엔드 개발  >  PHP의 상속 예에 대한 자세한 설명

PHP의 상속 예에 대한 자세한 설명

小云云
小云云원래의
2018-03-31 09:55:081330검색

상속은 클래스의 구조를 변경하지 않습니다. 대신 두 클래스 사이에 특정 관계가 있음을 나타내므로 해당 멤버가 다른 클래스에 존재하는 것처럼 보입니다.

주요 구문 프로세스는 다음과 같습니다. 하지만 새 객체를 생성할 때 먼저 데이터 영역에 저장 공간을 연 다음 객체를 초기화합니다. 초기화 과정에서 해당 객체에 해당하는 클래스 공간에서 변수나 메소드를 먼저 검색하고, 찾을 수 없거나 상속 관계가 있는 것으로 확인되면 해당 상위 클래스에서 검색합니다. 따라서 우리가 상속이라고 부르는 것은 클래스의 구조를 변경하는 것이 아니라 단지 두 상속 클래스 사이에 상속 관계를 추가하는 것뿐입니다. (예를 들어 다시 쓰기 작업: 하위 클래스와 상위 클래스에 동일한 메소드 이름이 있는 경우 해당 함수를 대체하고 현재 객체의 해당 클래스에 있는 메소드를 먼저 검색합니다. 일단 발견되면 검색을 계속하지 않습니다. 이때 상위 클래스의 메소드가 오버라이드된 것으로 보입니다. 이것이 바로 오버라이딩(overriding)의 개념입니다.

<?php
header("Content-Type:text/html;charset=utf-8");
Class A {
	public $p1=1;
	const c1=3;
	static $d1=5;
	private $e1=7;
	function f1(){
		echo "我是A中的方法!";
	}
}
Class B extends A{
	public $p2=2;
	const c2=4;
	static $d1=6;
	private $e2=8;
	function f1(){
		echo "我是B中的方法!".$this->e1;
		echo "我是B中的方法!".$this->e2;
	}
}
$o1=new B();
var_dump($o1);
echo "<br/>";
$o1->f1();
echo "<br/>";
A::f1();//此处不建议这么写,这是不严格的语法。
echo "<br/>";
?>

Note: var_dump($o1)에 변수 e1의 값이 있고 " ["e1":"A":private]=> int(7)"로 표시되어 있습니다. 이는 상속된 클래스 B에서 Private 속성을 변수 e1이라고 부를 수도 있으며 정의되지 않은 변수가 표시된다는 것을 보여줍니다. 이는 정적 변수가 상속될 수 있지만 해당 변수가 위치한 클래스만 이를 호출할 수 있음을 보여줍니다(하위 클래스는 상속할 수 있지만 호출할 수 없음).

<?php
	header("Content-Type:text/html;charset=utf-8");
	Class A {
		public $p1=1;
		const c1=3;
		static $d1=5;
		private $e1=7;
		function f1(){
			echo "我是A中的方法!".self::$d1;
		}
	}
	Class B extends A{
		public $p2=2;
		const c2=4;
		static $d2=6;
		private $e2=8;
		function f1(){
			echo "我是B中的方法!".self::$d1;
			//echo "我是B中的方法!".self::$d2;
		}
	}
	echo "<br/>";
	echo "类B中的静态属性d2:".B::$d2;
	echo "<br/>";
	echo "类B中能否继承父类A中的静态属性d1:".B::$d1;
	echo "<br/>";
	echo "类A中的静态属性d1:".A::$d1;
	echo "<br/>";
	echo "类A中能否访问子类B中的静态属性d2:".A::$d2;

이를 통해 하위 클래스는 상위 클래스의 정적 속성에 액세스할 수 있지만 상위 클래스는 하위 클래스의 정적 속성을 가져올 수 없음을 알 수 있습니다. 시스템은 실행 중에 "상향식" 검색 프로세스를 수행하므로 현재 클래스에서 먼저 검색하며, 찾을 수 없는 경우 레이어(부모 클래스)에서 위쪽으로 검색합니다. 상위 클래스는 다음 레벨(하위 클래스)로 검색할 수 없습니다.

참고: 정적 속성은 일반 속성처럼 객체의 데이터 공간에 존재하지 않습니다.

마지막으로 두 가지 예를 들어보겠습니다. 상속은 클래스의 구조를 변경하지 않습니다. 그것은 객체의 상위 클래스에 관한 것입니다. 그리고 상위 클래스에서 함수를 호출할 수 있습니다. (간단히 말하면, 객체가 생성되면 저장할 수 있는 일부 데이터는 현재 객체가 생성한 데이터 저장 영역에 저장됩니다. 객체를 통한 일부 후속 작업은 이 데이터 저장 영역에서 수행됩니다. 앞서 작성한 클래스와 직접적인 관계는 없습니다. 클래스가 작성되면 외부적으로 변경되지 않습니다.

위 내용은 PHP의 상속 예에 대한 자세한 설명의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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