php面向对象(四),类自动加载,对象克隆和遍历及序列化反序列化

来源:互联网 发布:java开源oa办公系统 编辑:程序博客网 时间:2024/05/16 10:53

类的自动加载

  • 含义:当某行代码需要一个类的时候,php的内部机制可以自动加载该类文件以满足需求。
  • 形式:

    function __autoload($name){    require "./".$name.".class.php";}
  • 条件和要求:

    1. 当需要一个类的时候,就会自动调用某个函数(默认是__autoload),并传入类名;
    2. 一个类应该保存到一个独立的“类文件中”,即其中只有该类的定义,没有别的代码;
    3. 习惯上,类文件的命名要有一定的“规则”,通常是:类名.class.php
    4. 通常,我们需要将各种累,存储在一些特定的目录汇总,以方便确定其位置;
    5. 在该自动加载的函数中,“充分”使用传过来的类名(__autoload的参数)以构建一个合适的文件路径并载入。

自定义自动加载函数

  • 含义:刚才的__autoload()函数,是系统内部的自动加载函数,我们只是定义其函数(不用自己声明)。但,我们可以使用更多函数(自定义的),来实现灵活的自动加载。

  • 基本模式为:

    1. 声明定义的函数为自动加载函数:spl_autoload_register(函数名);// 声明该名称的函数作为自动加载函数;
    2. 定义这个函数,跟定义__autoload()函数一样。

      function 函数名($class_name){}

      如:

      spl_autoload_register("autoload1");spl_autoload_register("autoload2");// 加载class目录的类function autoload1($class_name){    @require_once "./class/".$class_name.".class.php";}// 加载lib目录的类,实际情况是先用autoload1函数加载,再用autoload2函数加载,即这里先加载class目录的类再加载lib目录的类function autoload2($class_name){    @require_once "./lib/".$class_name.".class.php";}

对象的复制(克隆(“对象值传递”))

  • 语法:$新对象变量名 = clone $原对象变量名;

    如:

    $src = new Person();$rec = clone $src;

对象遍历

  • 含义:对象遍历和数组遍历一样

  • 遍历形式:

    foreach($对象名 as $key => $value){    // 这里就可以处理key和value了    // 对象的key和value是属性名和属性对应的值}
  • 注意:受保护的和静态属性在类外部不能遍历出来,但在类内部可以全部遍历出来。

php内置标准类

  • 含义:php语言内部有“很多现成的类”其中有一个类被称为“内置标准类”,这个类“内部”可以认为什么都没有,类似这样:class stdclass{};
  • 作用:可以用于存储一些临时的简单数据,也可以用于类型转换时用于存储数据。

对象的类型转换

  • 其他数据类型转换为对象类型,得到的结果是:内置标准类(stdclass)的一个对象!

    • 语法形式:$obj = (object)其他数据类型数据;
  • 数组类型转换为对象类型:数组的下标变成对象的属性名,值变成属性的值
    • 注意:当数组下标为数字时,无法通过对象语法获取其属性值,因为不推荐转换。
  • null数据类型转换为对象:其为一个空对象;
  • 其他标量数据转换为对象:属性名为固定的”scalar”,值为该变量的值。

类型约束

php是“弱类型语言”,通常不支持类型约束,但相应的强类型语言,类型约束却是“基本特征”,php中只支持局部的部分类型约束)

  • 含义:就是要求某个变量只能使用(接受,存储)某种指定的数据类型。
  • 形式:

    function 方法名(【要求使用的类型】 $p1){    // ...}
  • 说明:

    1. 定义一个函数(方法)是,一个形参,可以使用类型约束,也可以不用;
    2. 如果使用了类型约束,则对应的该实参数据,就必须是要求的那种类型;
    3. 能够使用的类型约束,其实非常少,只有以下几种可用:
      1. 数组:array
      2. 对象:使用类的名称表示传过来的实参必须是该类的实例;
      3. 接口:使用接口的名称表示传过来的实参必须是实现了该接口的类的实例。

__clone()魔术方法

  • 含义:当对一个类的对象使用“clone”运算符,就会克隆出一个跟当前对象完全一样的新对象出来,并且此时还会自动调用该类中的魔术方法:__clone();只要其中有方法
  • 禁止克隆:(通过对一个类的__clone()魔术方法私有化就可以实现禁止克隆)

序列化与反序列化技术

  • 含义:
    • 序列化:就是将一个变量所代表的“内存”数据,转换为“字符串”形式并持久保存在硬盘上的一种做法
    • 反序列化:就是将序列化之后保存在硬盘上的“字符串数据”恢复为其原来的内存形式的变量数据的一种做法
  • 做法:

    • 序列化:

      $v = 123; // 这是一个变量,代表任意的内存数据$s = serialize($v); // 将任何类型的变量数据转换为“字符串”file_put_contents("目标文件全路径",$s); // 将该字符串保存到一个文件里(硬盘数据)
    • 反序列化

      $s = file_get_contents("保存序列化数据的目标文件全路径");   // 从一个文件里读出其中的所有字符$v = unserialize($s); // 将该字符串数据,反序列化转换为变量(数据)

对象的系列化

  • 序列化
    • 对一个对象进行序列化,只能将其属性数据“保存起来”,而方法被忽略(方法不是数据);
    • 对象的序列化的时候,会自动调用该对象所在类的__sleep()(前提有这个方法)魔术方法,且,此时该方法必须返回代表(保存)要系列化的属性名数组;
    • 做法:和普通数据序列化一样!
  • 反序列化

    • 将一个对象进行反序列化,其实是恢复其原来保存起来的属性数据,而且必然需要依赖该对象原本的所属类(让当前反序列操作文件可以使用所属类,即可能需要include);
    • 对象的反序列化的时候,会自动调用该对象所在类的__wakeup()(前提有这个方法)魔术方法。

__tostring()魔术方法

  • 含义:当将一个对象当做字符串使用的时候会自动调用该方法,和java对象的tostring()方法一样!需返回一个字符串

__invoke()魔术方法

  • 含义:将一个对象当做函数来使用的时候,会自动调用该方法。通常不推荐

与类有关的魔术常量

  • __CLASS__:代表当前所在类的类名;
  • __METHOD__:代表其当前所在的方法名

与类有关的系统函数

  • class_exists(“类名”):判断一个类是否存在(是否定义过);
  • interface_exists(“接口名”):判断一个接口是否存在(是否定义过);
  • get_class($obj):获得某个对象$obj的所属类;
  • get_parent_class($obj):获取一个对象$obj的所属类的父类;
  • get_class_methods($obj):获取一个对象的所有方法名,结果是一个数组,里面存储的是这些方法的名称;
  • get_class_vars():获取一个对象的所有属性名,结果是一个数组,里面存储的是这些属性的名称;
  • get_declared_classes():获得“整个系统”所定义的类名,结果是一个数组,里面存储的是这些类的名称

与对象有关的系统函数

  • is_object($obj):判断某个变量是否是一个对象
  • get_object_vars($obj):获得一个对象的所有属性,结果是一个数组,里面存储的是这些属性的名称

与类有关的运算符

  • new:用于生成类的实例,也即对象
  • instanceof:判断一个“变量”(对象数据)是否是某个类的“实例”

static关键字的新用法和总结

  • 新用法:像“self”关键字一样,代表“当前类”,用于访问一个类的“静态属性或静态方法;,但在应用中,static代表的是“调用”当前方法的类,而不是“其代码所在的类”,self就比较死板,只代表这个单词本身所在位置的所在类。
  • 总结:

    含义 位置示例 代表函数或方法中的静态变量 function f(){
     static $v = 1;
    } 代表类中的静态成员 class A{
     static $v1 = 1;
     static function f(){}
    } 代表调用当前方法的当前类 class A{
     function f(){
      echo static::属性或方法名;
     }
    }
0 0