博客列表 >面向对象封装,继承,加载器

面向对象封装,继承,加载器

CC
CC原创
2021年02月04日 09:20:22660浏览

面向对象认识

  • oop: (Object Oriented Progrmming)面向对象编程
  • 面向过程编程: 直接面向变量函数编程
  • oop: 直接面向对象编程(封装了变量和函数的一个编程单元)

    面向过程认识

    1. <?php
    2. // 变量
    3. $n= 100;
    4. $m=200;
    5. // 函数
    6. function sum($a,$b){
    7. return $a+$b;
    8. };
    9. echo sum($n,$m);
  • 面向对象封装

  • 类的公有属性

    1. <?php
    2. // 声明的类与文件一致
    3. class Product
    4. {
    5. // 类成员:属性,方法
    6. // 属性:变量
    7. // public 公开指定name是公开属性(公有属性)
    8. public $name;
    9. public $price;
    10. // 方法:函数
    11. // 构造方法
    12. // 双下划线的方法:魔术方法,由系统自动调用
    13. // 类实例化的时候会调用它
    14. public function __construct($name, $price)
    15. {
    16. // 初始化类成员,让类实例化确定下来
    17. //this $当前类实例的引用
    18. $this->name = $name;
    19. $this->price = $price;
    20. // 不用return返回
    21. }
    22. public function show(): string
    23. {
    24. return "$this->name : $this->price 元";
    25. }
    26. }
  • 类的公有属性面向对象实例
    1. <?php
    2. <?php
    3. // 导入文件
    4. require 'Product.php';
    5. $moblie=new Product('电脑',888);
    6. echo $moblie->name;
    7. echo '<hr>';
    8. var_dump($moblie);
  • 受保护的私有属性
  1. <?php
  2. // 声明的类与文件一致
  3. class Product
  4. {
  5. // 类成员:属性,方法
  6. // 属性:变量
  7. //protected: 受保护成员,仅限本类以及子类访问
  8. protected $name;
  9. protected $price;
  10. // 方法:函数
  11. // 构造方法
  12. // 双下划线的方法:魔术方法,由系统自动调用
  13. // 类实例化的时候会调用它
  14. public function __construct($name, $price)
  15. {
  16. // 初始化类成员,让类实例化确定下来
  17. //this $当前类实例的引用
  18. $this->name = $name;
  19. $this->price = $price;
  20. // 不用return返回
  21. }
  22. public function show(): string
  23. {
  24. return "$this->name : $this->price 元";
  25. }
  26. }
  • 实例化访问受保护的私有方法
    1. <?php
    2. // 导入文件
    3. require 'Product.php';
    4. $moblie=new Product('手机',888);
    5. echo $moblie->show();
  • 本质是: 封装
  • 目标是: 代码复用
    类的加载器
  • 相当于中介
    1. <?php
    2. // 类的自动加载
    3. spl_autoload_register(function($class){
    4. require $class.'.php';
    5. });
    在加载器中引入,访问实例化类的方法
    1. <?php
    2. // 类的自动加载器
    3. require 'loader.php';
    4. // 实例化
    5. $snack = new Product('冰块',11);
    6. echo $snack->show();
    静态属性与静态方法
  • 静态属性:类中成员并非全部都要使用”类实例’方法,也有可以用”类”访问的成员
  1. <?php
  2. class Staff{
  3. // 静态属性
  4. public static $name;
  5. public static $id;
  6. // 构造函数
  7. public function __construct($name,$id)
  8. {
  9. self::$name = $name;
  10. self::$id = $id;
  11. }
  12. // 静态方法
  13. public static function show(){
  14. return sprintf('%s, 这个月工资: %d', self::$name, self::$id);
  15. }
  16. }
  1. <?php
  2. require 'loader.php';
  3. $staff = new Staff('刘五',66);
  4. // 访问类的静态属性
  5. echo Staff::$name;
  6. echo' <hr>';
  7. // 访问类的静态方法
  8. echo Staff::show();
  9. echo' <hr>';
  10. // 访问实例的静态方法
  11. echo $staff->show();
  12. // 不能访问实例的静态属性

继承

  • 父类

    1. <?php
    2. // 声明的类与文件一致
    3. class Product
    4. {
    5. // 类成员:属性,方法
    6. // 属性:变量
    7. //protected: 受保护成员,仅限本类以及子类访问
    8. protected $name;
    9. protected $price;
    10. // 方法:函数
    11. // 构造方法
    12. // 双下划线的方法:魔术方法,由系统自动调用
    13. // 类实例化的时候会调用它
    14. public function __construct($name, $price)
    15. {
    16. // 初始化类成员,让类实例化确定下来
    17. //this $当前类实例的引用
    18. $this->name = $name;
    19. $this->price = $price;
    20. // 不用return返回
    21. }
    22. public function show(): string
    23. {
    24. return "$this->name : $this->price 元";
    25. }
    26. }
  • 子类
  1. <?php
  2. require 'loader.php';
  3. // sub继承product类
  4. class Sub extends Product{
  5. // 对父类方法重写
  6. // 对父类的功能的扩展
  7. #子类构造器
  8. private $num;
  9. public function __construct($name,$price,$num)
  10. {
  11. // 调用父类构造方法
  12. parent::__construct($name,$price);
  13. // 添加子类构造方法
  14. $this ->num = $num;
  15. }
  16. // 输出方法
  17. public function show():string
  18. {
  19. // parent调用父类方法
  20. return parent::show().", 数量: $this->num 个";
  21. }
  22. // 子类里面定义新的方法,与show无关系
  23. public function total()
  24. {
  25. return "$this->name, 总计: ". ($this->price * $this->num) . ' 元';
  26. }
  27. }

-实例化

  1. <?php
  2. require 'loader.php';
  3. // 20是子类继承父类添加的方法
  4. // 实例化子类sub
  5. $sub =new Sub('好面包',40,20);
  6. echo $sub->show();
  7. echo '<hr>';
  8. // 重新定义的方法,与父类无关系
  9. echo $sub->total();
  • trait类的方法集,单继承子类可以从trait引入方法进行继承
  1. <?php
  2. // 当父类,trait,与当前子类中存在同名成员的如何解决?
  3. // 父类
  4. class P
  5. {
  6. public function m1()
  7. {
  8. return __METHOD__;
  9. }
  10. }
  11. # trait像类不是类,想当于中介
  12. trait T
  13. {
  14. // public function m1()
  15. // {
  16. // return __METHOD__;
  17. // }
  18. }
  19. // 子类
  20. class A extends P
  21. {
  22. use T;
  23. // 在子类中将父类的m1进行了重写
  24. // public function m1()
  25. // {
  26. // return __METHOD__;
  27. // // return parent::m1();
  28. // }
  29. }
  30. // 当子类与父类存在同名成员时,子类优先
  31. echo (new A)->m1(), '<br>';
  32. // 当trait中存在与父类同名的成员时,trait优先
  33. // own > trait > parent
声明:本文内容转载自脚本之家,由网友自发贡献,版权归原作者所有,如您发现涉嫌抄袭侵权,请联系admin@php.cn 核实处理。
全部评论
文明上网理性发言,请遵守新闻评论服务协议