1. 类继承的应用;
- PHP 只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类可以继承多个类。但一个类可以被多个类继承。
- 举个例子:有一个家庭,一个人可以有四个儿子,但是每一个儿子只能有一个父亲,当然这是他们共同的父亲
- 可以有多层继承,即一个类可以继承某一个类的子类,如类 B 继承了类 A,类C 又继承了类 B,那么类 C 也间接继承了类 A。
- 还是刚才的例子:一个人可以有四个儿子,那他的四个儿子还可以有儿子
# 代码
class A{
……
}
class B extends A{
……
}
- 使用在哪里:父类要把一些公共的属性提取出来,减少代码的重复,提高代码的重用性
- 实例:extend.class.php
<?php
class A{
public $name = "zhangshan";
public $age = 20;
public function say(){
return $this -> name;
}
}
class B extends A{
}
class C extends B{
}
$b = new B();
var_dump($b);
echo $b -> say();
echo "<hr />";
$c = new C();
var_dump($c);
echo $c -> say();
- 举例:我们有一个”人“类,把人共有的属性和方法写出来,比如人都有名字、年龄和性别。有一些方法,人都会说话,都会走路,都会吃饭,这是人的共有的特性。人又可以按职业分为很多种职业的人,比如说学生、老师。老师就会有自己特有的一些成员属性还有成员方法。老师有他的工作场所,老师可以上课。学生是属于xx学校的,学生可以学习。
- 实例:person.class.php
<?php
class person{
public $name;
public $age;
public $gender;
public function __construct($name, $age, $gender){
$this -> name = $name;
$this -> age = $age;
$this -> gender = $gender;
}
public function say(){
echo "say...";
}
public function eat(){
echo "eat...";
}
public function run(){
echo "run...";
}
}
class teacher extends person{
public function teach(){
echo "teach...";
}
}
class student extends person{
public function learn(){
echo "learn...";
}
}
$teacher = new teacher("zhangsan", 30, 'male');
$teacher -> teach();
$teacher -> learn();
echo "<hr />";
$student = new student("lisi", 18, 'female');
$ student -> learn();
2. 访问类型的控制;
| private | protected | public |
---|
在同一类中 | 可以 | 可以 | 可以 |
在子类中 | 不可以 | 可以 | 可以 |
在类的外部 | 不可以 | 不可以 | 可以 |
<?php
class person{
public $name;
private $age;
protected $gender;
public function __construct($name, $age, $gender){
$this -> name = $name;
$this -> age = $age;
$this -> gender = $gender;
}
public function p1(){
echo "p1";
}
private function p2(){
echo "p2";
}
protected function p3(){
echo "p3";
}
public function test1(){
}
}
class student extends person{
public function test(){
}
}
$person = new person("zhangsan", 18, "male");
$person -> test1();
- 权限控制有一个很重要的作用,在写一个类的时候,如果有很多中间流程,中间流程是用户访问没有任何的结果的、或者说有结果也是错误的、只是一个中间内部的运算过程、是给类进行内部调用的,不会让用户进行外部调用,那就要声明成私有的。
- 声明成私有的还有一个好处,那就是方便别人去阅读你写的这个类。他并不需要掌握你中间的流程,在读你的类的时候只需要找到 public 所修饰的,然后调用就可以了。
3. 子类中重载父类方法。
- 在子类里面允许重写(覆盖)父类中的方法
- 在子类中,使用 parent 访问父类中被覆盖的属性和方法
# 代码
parent::__construct();
parent::fun();
<?php
class person{
public $name;
public $age;
public $gender;
public function __construct($name, $age, $gender){
$this -> name = $name;
$this -> age = $age;
$this -> gender = $gender;
}
public function say(){
echo "我的名字是:{$this -> name},我的年龄是:{$this -> age},我的性别是:{$this -> gender}";
}
}
class teacher extends person{
public $teach;
public function __construct($name, $age, $gender, $teach){
parent::__construct($name, $age, $gender);
$this -> teach = $teach;
}
public function say(){
parent::say();
echo ",我教的学科是:{$this -> teach}";
}
}
class student extends person{
public $school;
public function __construct($name, $age, $gender, $school){
parent::__construct($name, $age, $gender);
$this -> school = $school;
}
public function say(){
parent::say();
echo ",我所在的学校是:{$this -> school}";
}
}
$teacher = new teacher("张三", 30, '男', '数学');
$teacher -> say();
echo "<hr />";
$student = new student("李四", 18, '女', '北大');
$student -> say();