面向对象认识

  • 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

更多相关文章

  1. 接口和抽象类
  2. 类声明与实例化、类的静态成员与类的扩展、trait与父类区别联系
  3. 面向对象编程基础
  4. 接口和抽象类的实现-区别与联系
  5. PHP面向对象编程
  6. 类声明-实例化-成员-继承-trait特征类
  7. Java基础知识点1
  8. 全面演示: 函数的作用域与闭包,回调的使用场景以及函数的多值返
  9. [计算机视觉论文速递] 2018-03-14

随机推荐

  1. 无法为Windows编译QT MYSQL插件。
  2. 记一次无备份恢复Mysql误删用户数据
  3. SQL数据库基础(四)
  4. MySQL中实现Oracle里面 rank()over ( PAR
  5. 在Navicat 中设置 SQL 格式的方法
  6. mysql 去除重复数据
  7. mysql数据库大规模数据读写并行时导致的
  8. 牛客网数据库SQL实战(1-5)
  9. SSAS中用于层次结构的数据驱动安全性
  10. 在php中连接mysql列值