php 自动加载简介

php  

PHP自动加载简介

问题描述

在最初的php版本中,引入文件是用 include/require 等函数,在需要引入的时候手动执行函数,当系统过于庞大时,include/require大量调用也使得系统维护的难度系数增大,便有了自动加载文件的定义,在遇到没有定义的类的时候,__autoload函数自动触发,同时为了避免在一个函数中写大量的路径判断逻辑和文件包含代码,php又提供了SPL(PHP标准库) spl_autoload等函数。

具体分析

include/require问题:

  1. 当系统庞大时,有一堆的include/require,而且有些可能用不到;
  2. 在使用include_once/require_once时,函数还是比较耗资源的;

__autoload;

  1. php5 提供了__autoload函数,当程序在用到未知类时才去加载类文件,也称延迟加载。
  2. 缺点,autoload只能有一个,当系统庞大时,自动加载会使得autoload函数巨复杂,想想自己看代码时,一个函数可能500行,什么感觉;

SPL Autoload,php5.1.2版本提供的

  1. 维护了一个autoload函数栈(队列属性,先进栈的优先调用);
  2. 每次调用spl_autoload_register函数的时候,便将函数压到autoload函数栈中;
  3. 参数的函数可以控制当前autoload函数被压到栈头还是栈尾,在php5.3之后支持匿名函数和类函数;
    1. spl_autoload_register($functionName); 说明:如果有命名空间,参数应该是 \namespace\functionName。本质spl_autoload_register(__NAMESPACE__.'\autoload1');
    2. spl_autoload_register(function(){}); 使用匿名函数
    3. spl_autoload_register(__NAMESPACE__ .'\类名::静态函数');
  4. 当new一个不存在的对象时。会按照进栈的先后顺序一次进行调用,如果找到,则结束调用;

自动加载的本质:

  • 依据类名称确定类文件名;
  • 同时确定类文件的磁盘路径;
  • 加载类文件。(当然还是用include/require);


评论 0

发表评论

Top