语法
class 子类 extends 父类{
}
例题
<?php
//父类
class Person {
public function show() {
echo '这是人类<br>';
}
}
//子类继承父类
class Student extends Person {
}
//测试
$stu=new Student;
$stu->show(); //这是人类
执行过程:
第一步:在Student类中查找show(),如果找到就调用,找不到就到父类中查找
第二步:在Person类中查询show()
<?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关键字调用父类的成员
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、如果子类有构造函数就调用子类的,如果子类没有就调用父类的构造函数。
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
*/
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) { }
PHP不允许多重继承,因为多重继承容易产生二义性
如何实现C继承A和B,使用继承链