php 自动加载简介
- php
- 2018-06-13
- 5311
- 0
PHP自动加载简介
问题描述
在最初的php版本中,引入文件是用 include/require 等函数,在需要引入的时候手动执行函数,当系统过于庞大时,include/require大量调用也使得系统维护的难度系数增大,便有了自动加载文件的定义,在遇到没有定义的类的时候,__autoload函数自动触发,同时为了避免在一个函数中写大量的路径判断逻辑和文件包含代码,php又提供了SPL(PHP标准库) spl_autoload等函数。
具体分析
include/require问题:
- 当系统庞大时,有一堆的include/require,而且有些可能用不到;
- 在使用include_once/require_once时,函数还是比较耗资源的;
__autoload;
- php5 提供了__autoload函数,当程序在用到未知类时才去加载类文件,也称延迟加载。
- 缺点,autoload只能有一个,当系统庞大时,自动加载会使得autoload函数巨复杂,想想自己看代码时,一个函数可能500行,什么感觉;
SPL Autoload,php5.1.2版本提供的
- 维护了一个autoload函数栈(队列属性,先进栈的优先调用);
- 每次调用spl_autoload_register函数的时候,便将函数压到autoload函数栈中;
- 参数的函数可以控制当前autoload函数被压到栈头还是栈尾,在php5.3之后支持匿名函数和类函数;
spl_autoload_register($functionName); 说明:如果有命名空间,参数应该是 \namespace\functionName。本质spl_autoload_register(__NAMESPACE__.'\autoload1');
spl_autoload_register(function(){}); 使用匿名函数
spl_autoload_register(__NAMESPACE__ .'\类名::静态函数');
- 当new一个不存在的对象时。会按照进栈的先后顺序一次进行调用,如果找到,则结束调用;
自动加载的本质:
- 依据类名称确定类文件名;
- 同时确定类文件的磁盘路径;
- 加载类文件。(当然还是用include/require);