PHP 面向对象编程之继承性

1. 类继承的应用;

  • PHP 只支持单继承,不允许多重继承。一个子类只能有一个父类,不允许一个类可以继承多个类。但一个类可以被多个类继承。
    • 举个例子:有一个家庭,一个人可以有四个儿子,但是每一个儿子只能有一个父亲,当然这是他们共同的父亲
  • 可以有多层继承,即一个类可以继承某一个类的子类,如类 B 继承了类 A,类C 又继承了类 B,那么类 C 也间接继承了类 A。
    • 还是刚才的例子:一个人可以有四个儿子,那他的四个儿子还可以有儿子
# 代码

class A{
			……
}


class B extends A{
			……
 }

  • 使用在哪里:父类要把一些公共的属性提取出来,减少代码的重复,提高代码的重用性
  • 实例:extend.class.php
<?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 -> say();
$teacher -> teach();
$teacher -> learn();
echo "<hr />";
$student = new student("lisi", 18, 'female');
// $student -> run();
$ student -> learn();

2. 访问类型的控制;

  • 访问权限
privateprotectedpublic
在同一类中可以可以可以
在子类中不可以可以可以
在类的外部不可以不可以可以
  • 实例:person.class.php
<?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(){
        // echo $this -> name;               // 公有的成员属性在类的内部可以访问    
        // echo $this -> age;                // 私有的成员属性在类的内部可以访问
        // echo $this -> gender;             // 受保护的成员属性在类的内部可以访问
        // $this -> p1();                    // 公有的成员方法在类的内部可以访问
        // $this -> p2();                    // 私有的成员方法在类的内部可以访问
        // $this -> p3();                    // 受保护的成员方法在类的内部可以访问
    }
}


class student extends person{

    public function test(){
        // echo $this -> name;           // 公有的成员属性在子类中可以访问
        // echo $this -> age;            // 私有的成员属性在子类中**不可以**访问           
        // echo $this -> gender;         // 受保护的成员属性在子类中可以访问
        // $this -> p1();                // 公有的成员方法在子类中可以访问
        // $this -> p2();                // 私有的成员方法在子类中**不可以**访问
        // $this -> p3();                // 受保护的成员方法在了类中可以访问
    }
}


$person = new person("zhangsan", 18, "male");
// echo $person -> name;         // 公有的成员属性在类的外部可以访问
// echo $person -> age;          // 私有的成员属性在类的外部**不可以**直接访问
// echo $person -> gender;       // 受保护的成员属性在类的外部**不可以**直接访问
// $person -> p1();              // 公有的成员方法在类的外部可以访问
// $person -> p2();              // 私的有成员方法在类的外部**不可以**直接访问
// $person -> p3();              // 受保护的成员方法在类的外部**不可以**直接访问
//
// $student = new student("lisi", 20, "female");
// $student -> test();
//
$person -> test1();

  • 权限控制有一个很重要的作用,在写一个类的时候,如果有很多中间流程,中间流程是用户访问没有任何的结果的、或者说有结果也是错误的、只是一个中间内部的运算过程、是给类进行内部调用的,不会让用户进行外部调用,那就要声明成私有的。
  • 声明成私有的还有一个好处,那就是方便别人去阅读你写的这个类。他并不需要掌握你中间的流程,在读你的类的时候只需要找到 public 所修饰的,然后调用就可以了。

3. 子类中重载父类方法。

  • 在子类里面允许重写(覆盖)父类中的方法
  • 在子类中,使用 parent 访问父类中被覆盖的属性和方法
# 代码

parent::__construct();
parent::fun();

  • 实例: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 "我的名字是:{$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::父类中的方法名
        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();

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值