美文网首页
第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