博客列表 >类的封装,继承,多态

类的封装,继承,多态

手机用户1631860753
手机用户1631860753原创
2021年10月23日 20:46:38657浏览

一.类

  • 面向对象:oop :是有下往上,要先把类写好,然后在写流程的时候提取类使用
  • 以前学习的代码是一行一行往下执行的,所以是由上往下
  • 类,有两个部分组成:成员属性(变量)和成员方法(函数)
  • 根据类创建出来的对象,就是对象,每个对象都是独一无二的
  • 我们写类的时候,一个类,要给一个文件,而且文件名,要和class类名一样,
  • 访问修饰符,有三个:

    public 公用的
    protected 受保护的,在外面不能直接访问
    private 私有的

  • PHP的oop面向对象开发,它的三大特性:封装,继承,多态

  • require_once 加载,可以加载引入类使用

1.封装

-创建类

  1. class A
  2. {
  3. // 成员属性
  4. // 公开的,外部可以访问
  5. public $name;
  6. public $id = 123; // 给默认值
  7. // 受保护的,在外面不可以访问,但是可以继承
  8. protected $salary;
  9. // 私有的,只能本类(我)自己调用,子类都继承不了的
  10. private $password;
  11. // 构造方法,专门给受保护的属性,给与重新赋值,构造方法也是可以继承的
  12. public function __construct($a, $b, $c, $d)
  13. {
  14. $this->name = $a;
  15. $this->id = $b;
  16. $this->salary = $c;
  17. $this->password = $d;
  18. }
  19. // 可以通过 __construct 方法里,把其他属性通过用户传过来
  20. public function bldy()
  21. {
  22. return "我的名字叫:{$this->name},我的id是:{$this->id},我的工资是:{$this->salary},我的密码是:{$this->password}";
  23. }
  24. // 方法在本类里调用 用 $this 代表本类和英文里的 my一个意思
  25. public function dy()
  26. {
  27. return $this->bh() . ',另外:' . $this->sy();
  28. }
  29. // 成员方法 可以公开的
  30. public function gk()
  31. {
  32. return '这里可以写很多代码,进行功能处理,和函数一样,也可以写返回的数据类型';
  33. }
  34. // 成员方法,受保护的
  35. protected function bh()
  36. {
  37. return '这个方法是受保护的,可以继承';
  38. }
  39. // 成员方法,私有的
  40. private function sy()
  41. {
  42. return '私有的,子类是继承不了的';
  43. }
  • 引用类
    1. require_once 'A.php'; // 引用创建的 A 类
    2. // 这个类创建出来,给不能访问的属性,添加默认值
    3. $obj = new A('晋阳', '123', '5000', '123456');
    4. echo $obj->name; // name 是公开的,所以可以输出
    5. echo '<hr>';
    6. echo $obj->id;
    7. echo '<hr>';
    8. echo $obj->salary; // 受保护的,在外部不能调用,所以报错
    9. echo '<hr>';
    10. echo $obj->password; // 私有的,只能自己使用,所以报错
    11. echo '<hr>';
    12. echo $obj->bldy(); // 受保护的和私有的在外部不能访问,但是可以自己调用出来
    13. echo '<hr>';
    14. echo $obj->dy(); // 在本类中可以用$this调用方法

2.继承

  • 子类继承父类的功能,那子类就有父类的功能可以少写很多代码,
  • 继承的关键词:extends
  • 子类继承父类是所有属性,除了私有的继承不了,
  • 子类还可以在父类的基础上进行功能扩展
  • 如果子类方法的名字,和父类的名字冲突了,就相当于重写
  • 子类中变量重写可以在构造方法里进行重写赋值
  • 当子类重写父类的方法时,如果还想用父类的方法,可以用 parent:: 进行调用
  • 传值的属性,是先传给子类,如果子类里面有构造方法先使用了它,它就优先用子类的构造方法,替换掉父类的构造方法

  • 创建子类

    1. require_once 'A.php';
    2. // B 类,继承 A类
    3. class B extends A
    4. {
    5. // 可以在父类的基础上进行扩展
    6. // public $age;
    7. // 可以重写构造方法,对属性进行重新赋值
    8. // public function __construct($age)
    9. // {
    10. // $this->age = $age;
    11. // }
    12. // 受保护的属性在子类里也可以调用,但是要在子类里面使用
    13. public function get_salary()
    14. {
    15. return '父类的工资是:' . $this->salary;
    16. }
    17. // 子类和父类都有 bldy 重复了,可以用 parent:: 调用父类的 bldy
    18. public function bldy()
    19. {
    20. return parent::bldy() . ',这是从B类里传出来的';
    21. }
    22. }
  • blay在子类调用

3.类的自动调用

  • 函数:spl_autoload_register 自动加载
  • 自动调用类的时候,会自动找到对应的文件名
  • 实现自动加载,所有文件名和类名要保持一致,
  • class 后面的类名,要和文件名一样,自动加载才能找到进行调用
  • 创建类的自动加载
  1. spl_autoload_register(
  2. function ($className) {
  3. // $className 是new的B这个名字,这个名字是类名,不是文件名
  4. require_once $className . '.php';
  5. }
  6. );

4.不能继承

  • 不给重写,关键词:final 加在public前面,让这个方法不能重写,只能用我这个,或者修改名字
  • 把 final 写在 class 前面那么这个类就不能被继承

  • 不能继承

  1. // final 写在 class前面这个类就不能被继承
  2. final class C
  3. {
  4. public $name;
  5. public $id;
  6. protected $salary;
  7. private $password;
  8. public function __construct($a, $b, $c, $d)
  9. {
  10. $this->name = $a;
  11. $this->id = $b;
  12. $this->salary = $c;
  13. $this->password = $d;
  14. }
  15. // final 写在方法前面,那么这个方法就不能被修改
  16. final public function bldy()
  17. {
  18. return "我的名字叫:{$this->name},我的id是:{$this->id},我的密码是:{$this->password},我的工资有:{$this->salary}";
  19. }
  20. }

5.静态成员

  • 静态成员的关键词:static 可以给属性(变量),也可以给方法
  • 静态成员用 self:: 代表本类
  • 静态成员可以给属性默认值.但是不能给方法默认值,
  • 如果这个属性和方法是静态的,就不要用原始的访问方式了
  • 静态成员访问方式,用类名::属性名,类名::方法名()

  • 一个类,不用实例就能使用里面的属性和方法.

  • 没有对象也能使用静态成员
  • 静态成员,变量访问,变量要加 $ 符号
  • 静态成员由本类掉用,为所有实例共享

  • 静态类

  1. class Shop
  2. {
  3. // 静态属性
  4. public static $title;
  5. public $price;
  6. public $num1 = 1;
  7. public static $num2 = 2;
  8. public function __construct($t, $p)
  9. {
  10. $this->title = $t;
  11. $this->price = $p;
  12. $this->num1++; // 普通变量,都是从头开始计算
  13. // self:: 代表静态成员的本类
  14. self::$num2++; // 静态成员,只要是调用了,就会增加1
  15. }
  16. // 静态方法
  17. public static function cartoon()
  18. {
  19. return '使用' . Shop::$title;
  20. }
  21. }
  • 调用

    1. Shop::$title = '苹果13Pro'; // 赋值
    2. echo Shop::$title;
    3. echo '<hr>';
    4. echo Shop::cartoon();
    5. echo '<hr>';
    6. echo Shop::$num2;
  • 输出

声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议