美文网首页
第3天:面向对象(三):抽象类、final、const、相关技术

第3天:面向对象(三):抽象类、final、const、相关技术

作者: zphphp | 来源:发表于2019-11-02 10:40 被阅读0次

    7.1 为什么需要抽象类
    l 先看一个问题?


    image.png
    image.png

    7.2 抽象类的基本介绍
    当父类的一些方法不能确定时,可以用abstract关键字来修饰该方法[抽象方法],用abstract 来修饰该类 [抽象类]。


    image.png
    7.3 抽象类的细节说明
    l 抽象类不能被实例化
    代码说明:
    image.png

    l 抽象类可以没有abstract方法
    l 抽象类可以有非抽象方法, 成员属性和常量
    代码说明:


    image.png

    l 一旦类包含了abstract方法,则这个类必须声明为abstract
    l 抽象方法不能有函数体


    image.png

    l 如果一个类继承了某个抽象类,则它必须实现该抽象类的所有抽象方法.(除非它自己也声明为抽象类), 如果是多级继承,则需要把所有的抽象方法都实现.

    代码说明:


    image.png
    image.png

    7.4 抽象类的最佳实践


    image.png

    代码:


    image.png
    image.png
    image.png

    l 课堂练习


    image.png

    8.接口
    2.1 接口的概念


    image.png

    2.2 接口的介绍


    image.png
    l 怎么理解接口和价值.
    image.png

    2.3 接口的基本使用


    image.png

    l 快速入门案例:


    image.png
    l 我们使用代码来模拟一下我们的设备接入到电脑插口中的情
    image.png
    image.png
    image.png

    8.4 接口的应用场景


    image.png
    image.png

    8.5 接口的细节

    l 接口不能被实例化

    代码:

    image.png
    l 接口中所有的方法都不能有主体

    l 类可以同时实现多个接口

    类和接口的关系时实现,接口和接口的关系时继承!

    image.png
    l 接口中可以有属性,但只能是常量 ,默认是public, 但不能用public 显式修饰
    案例说明:
    image.png

    l 接口中的方法都必须是****public****的****,****默认就是****public

    image.png

    l 一个接口不能继承其它的类****,****但是可以继承别的接口

    image.png

    示意图:


    image.png

    代码:


    image.png

    8.6 类的定义改进


    image.png

    8.7 接口和继承的区别


    image.png

    代码:


    image.png
    image.png

    8.8 小结


    image.png

    9.final 关键字

    9.1 基本概念
    PHP 5 新增了一个 final 关键字。如果父类中的方法被声明为 final,则子类无法覆盖该方法。如果一个类被声明为 final,则不能被继承.
    1.2 什么情况下可能使用到final


    image.png

    l 基本语法是:

    final class 类名{
    } //final 类
    class  类名{
    final 访问修饰符 function  方法名(){}  // final 方法
    }
    

    9.3 快速体验案例


    image.png
    image.png
    image.png

    9.4 final 练习题


    image.png

    9.5 final 使用注意事项
    l final不能够修饰成员属性(变量)
    l final 方法不能被重写,但可以被继承.
    l 一般来说,final 类中不会出现final 方法,因为final类都不能被继承,也就不会去重写override final类的方法了。
    l final 类 是可以被实例化的
    案例说明:


    image.png

    第 10 章 类常量(const)

    10.1 基本概念

    某些情况下,程序员可能有这样的需求:

    当不希望一个成员变量被修改,希望该变量的值是固定不变的。这时可以用const 去修饰该成员变量,这样这个变量就自动成为常量 , 比如所得税率, 数学中的圆周率等

    10.2 基本语法

    class  类名{
    const  常量名 = 初值;
    }
    

    常量的定义如上,不需要访问修饰符,也没有$, 名字是大写字母.

    10.3 快速入门案例


    image.png

    10.4 使用的注意事项
    l 常量名一般字母全部大写 : TAX_RATE ,中间可以有下划线 TAX_RATE
    l 在定义常量的同时,必须赋初值, 比如 const TAX_RATE=1.1
    l const关键字前不能用public/protected/private修饰。默认是public
    l 注意事项,访问的情况


    image.png
    image.png
    image.png

    说明上面的代码

    (1) 在类的内部,我们访问类常量可以使用 self::常量名 或者 类名::常量名,但是我们推荐使用 self::常量名;
    (2) 在类的外部,可以使用 类名::常量名,注意常量也可以在其它函数中使用。
    l 常量的值在定义的时候就初始化,以后就不能修改.
    l 常量可以被子类继承
    l 一个常量是属于一个类的,而不是某个对象的
    l 常量可以接收哪些数据类型
    代码:


    image.png

    总结: 常量可以是 int , float, bool, string ,array, 对象不可以。

    10.5 常量练习题


    image.png

    11 PHP面向对象的相关技术
    11.1 对象克隆技术和分析


    image.png

    代码:


    image.png

    11.2 对象的遍历
    l 基本的说明


    image.png

    代码说明:

    image.png
    image.png

    11.3 php内置标准类

    基本概念:如果,我们希望把一些数据,以对象的属性的方式存储,同时我们又
    不想定义一个类,可以考虑使用 PHP内置标准类 stdClass [standard标准]
    基本使用

    image.png

    PHP的语法松散:

    image.png

    11.4 其它数据类型转对象的说明


    image.png

    代码:


    image.png

    11.5 对象的序列化和反序列化(重点)
    对象的序列化的基本概念: 所谓对象的序列化,就是可以把某个对象的属性名称,属性值, 属性类型,类名 以字符串的形式保存到文件中,在你需要的时候可以重新恢复.
    对象的反序列化的基本概念, 是序列化的逆向过程.

    image.png
    代码:
    序列化的代码:
    image.png
    反序列化的代码:
    image.png
    l 对象序列化的练习
    image.png

    11.6 将对象当做字符串使用
    要求: 将对象的类名,函数,属性都显示出来。


    image.png

    代码:


    image.png
    image.png

    11.7 类与对象的相关函数(重点)
    概述: 函数的一览表:


    image.png

    l 重点讲解五个函数,其它的同学们可以自己看.


    image.png
    image.png

    11.8 traits使用(掌握)

    基本概念的介绍: PHP的OOP编程中,为了让单继承更好的复用代码,提供了一套机制,可以灵活的引入代码,这个机制就是我们的traits.
    看图说明:

    image.png
    l 代码实现:
    image.png
    image.png
    l 特别说明一下, traits 的优先级问题.
    说明: 如果父类和trait 代码都有相同的函数,则以trait的代码为准.

    11.9 这里单例模式加强说明
    为了让单例防止程序员继承,我们将其做成一个 final 类.


    image.png

    11.10 反射机制
    l 基本介绍


    image.png
    l 反射技术在哪里使用到
    image.png
    l 一个经典的tp控制器调度需求
    image.png

    l 打点基础
    比如我们常规的调用成员方法的形式是这样的

    $对象 = new  类();
    $对象->方法();
    方法对象->invoke($对象, '参数');
    

    l 案例:我将使用反射的机制,实现代理调用. 方法对象->invoke($对象, '参数');


    image.png

    l 代码:

    image.png
    image.png

    l 我们完成前面提出的tp 调用机制


    image.png

    代码:

    <?php
      header('content-type:text/html;charset=utf-8');
    
      class IndexAction{
        public function index(){
            echo 'index <br>';
        }
        public function test($year = 2016, $month = 10, $day = 10){
           echo $year.'--------'.$month.'-----------'.$day.'<br>';
        }
        public function _before_index(){
            echo  '<br> 前期处理....';
            echo  '<br>' .__FUNCTION__.'<br>';
        }
        public function _after_index(){
            echo  '<br> 后期的处理';
            echo  __FUNCTION__.'<br>';
        }
      }
    
    
      /*
      1.IndexAction中的方法和访问控制修饰符是不确定的,如果index 方法是public,可以执行 _before_index.
      2.如果存在_before_index 方法,并且是public的,执行该方法
      3.执行test方法
      4. 再判断有没有_after_index方法,并且是public的,执行该方法
    
      */
    
      //1. 先创建一个反射对象
      $reflect_object = new ReflectionClass('IndexAction');
      //2. 判断index方法是否存在
      if($reflect_object->hasMethod('index')){
        echo '<br> 有index';
        //3. 获取 index这个方法对象
        $reflect_index_method = $reflect_object->getMethod('index');
        if($reflect_index_method->isPublic()){
          
          echo '<br> index 是public';
          //获取 _before_index 方法
          if($reflect_object->hasMethod('_before_index')){
            
            //获取 _before_index 方法对象
            $reflect_before_index_method = $reflect_object->getMethod('_before_index');
    
            //判断是否是public
            if($reflect_before_index_method->isPublic()){
              
              $reflect_before_index_method->invoke
                ($reflect_object->newInstance());
            }
          }
        
          //反向调用test
          $reflect_object->getMethod('test')->invoke($reflect_object->newInstance(), 2017, 11,11);
          
          //判断后置函数是否执行.
    
          //获取 _after_index 方法
          if($reflect_object->hasMethod('_after_index')){
            
            //获取 _after_index 方法对象
            $reflect_after_index_method = $reflect_object->getMethod('_after_index');
    
            //判断是否是public
            if($reflect_after_index_method->isPublic()){
              
              $reflect_after_index_method->invoke
                ($reflect_object->newInstance());
            }
          }
    
        }
      }else{
        echo '<br>没有index, 直接退出';
      }
    

    l 课后练习题:


    image.png

    l 小结


    image.png

    相关文章

      网友评论

          本文标题:第3天:面向对象(三):抽象类、final、const、相关技术

          本文链接:https://www.haomeiwen.com/subject/ljycbctx.html