PHP-面向对象(继承)

1.12 继承

1.12.1 继承介绍

  1. 继承使得代码具有层次结构
  2. 子类继承了父类的属性和方法,实现了代码的可重用性。
  3. 使用extends关键字实现继承
  4. 父类和子类是相对的

语法

class 子类 extends 父类{
}

例题

<?php
//父类
class Person {
	public function show() {
		echo '这是人类<br>';
	}
}
//子类继承父类
class Student extends Person {
}
//测试
$stu=new Student;
$stu->show();			//这是人类

执行过程:

第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找

第二步:在Person类中查询show()

1.12.2 子类中调用父类成员

<?php
//父类
class Person {
	public function show() {
		echo '这是人类<br>';
	}
}
//子类
class Student extends Person {
	public function test() {
		//方法一;
		/*
		$person=new Person();
		$person->show();		//这是人类
		*/
		//方法二
		$this->show();			//这是人类
	}
}
//测试
$stu=new Student;
$stu->test();

小结:

1、方法一:通过实例化父类调用父类的成员

2、方法二:通过$this关键字调用父类的成员

1.12.3 protected

protected:受保护的,在整个继承链上使用

例题:

//例题一:
<?php
class A {
	protected $num=10;	//在整个继承链上访问
}
class B extends A {	
	public function getNum() {
		echo $this->num;
	}
}
//测试
$obj=new B();    //整个继承链上有A和B
$obj->getNum();		//10

//例题二:
<?php
class A {
	public function getNum() {
		echo $this->num;
	}
}
class B extends A {
	protected $num=10;	
}
//测试
$obj=new B();	//整个继承链上有A和B
$obj->getNum();		//10

//例题三:
<?php
class A {
	public function getNum() {
		echo $this->num;
	}
}
class B extends A {
	protected $num=10;	
}
//测试
$obj=new A();     //整个继承链上只有A
$obj->getNum();	 //Notice: Undefined property: A::$num 

1.12.4 继承中的构造函数

规则:

1、如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数。

2、子类的构造函数调用后,默认不再调用父类的构造函数

通过类名调用父类的构造函数

类名::__construct()

例题

<?php
class Person {
    //父类的构造函数
	public function __construct() {
		echo '这是父类<br>';
	}
}
class Student extends Person {
    //子类的构造函数
	public function __construct() {
		Person::__construct();		//通过父类的名字调用父类的构造函数
		parent::__construct();		//parent表示父类的名字
		echo '这是子类<br>';
	}
}
//测试
new Student();

注意:parent关键字表示父类的名字,可以降低程序的耦合性

例题:给父类传递参数

<?php
class Person {
	protected $name;
	protected $sex;
    //父类的构造函数
	public function __construct($name,$sex) {
		$this->name=$name;
		$this->sex=$sex;
	}
}
class Student extends Person {
	private $score;
    //子类的构造函数
	public function __construct($name,$sex,$score) {
		parent::__construct($name,$sex);  //调用父类构造函数并传递参数
		$this->score=$score;
	}
    //显示信息
	public function getInfo() {
		echo "姓名:{$this->name}<br>";
		echo "性别:{$this->sex}<br>";
		echo "成绩:{$this->score}";
	}
}
//测试
$stu=new Student('tom','男',88);
$stu->getInfo();
/*
姓名:tom
性别:男
成绩:88
*/

1.12.5 $this详解

t h i s this表示当前对象的引用,也就是是或 this保存的当前对象的地址

<?php
class A {
	public function __construct() {
		var_dump($this);
	}
}
class B extends A {
	
}
new A();	//object(A)#1 (0) { } 
echo '<br>';
new B();	//object(B)#1 (0) { } 

1.12.6 多重继承

PHP不允许多重继承,因为多重继承容易产生二义性

在这里插入图片描述

如何实现C继承A和B,使用继承链

在这里插入图片描述

发布了1891 篇原创文章 · 获赞 2010 · 访问量 18万+

猜你喜欢

转载自blog.csdn.net/weixin_42528266/article/details/105138738