一:什么是自动加载

我们在new出一个class的时候,不需要手动去require或include来导入这个class文件,而是程序自动帮你导入这个文件
不需要手动的require那么多class文件了


二:怎么样才能自动加载呢

PHP提供了2种方法,一个是魔术方法 __autoload($classname),另外一个是函数 spl_autoload_register()


三:__autoload 自动加载

3.1 原理

当我们new一个classname的时候,如果php找不到这个类,就会去调用 __autoload($classname),new的这个classname就是这个函数的参数
所以我们就能根据这个classname去require对应路径的类文件,从而实现自动加载

3.2 使用

student.php

<?php
class student {
function __construct() {
echo "i am a student";
}
}
?>

index.php

<?php
$stu = new student(); function __autoload($classname) {
require $classname.'.php';
}
?>

四:spl_autoload_register 自动加载

4.1 为什么又出现了个spl_autoload_register 呢

因为一个项目中只能有一个__autoload,项目小,文件少,一个__autoload 足够用了, 但是随着需求的增加,项目文件变的越变越多,我们需要不同的自动加载来加载不同路径的文件,这时候只有一个 __autoload 就不够用了,如果写2个__autoload,就会报错,所以 spl_autoload_register 函数应运而生,这个函数比 __autoload更好用,更方便

4.2 spl_autoload_register 函数说明

当我们new一个classname的时候,php找不到classname,php就会去调用spl_autoload_register 注册的函数,这个函数通过参数传递进去

函数原型:

bool spl_autoload_register ([ callable autoload_function[,bool throw = true [, bool $prepend = false ]]] )

autoload_function:
欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

throw:
此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend:
如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

4.3 几种参数形式的调用

sql_autoload_resister('load_func'); //函数名
sql_autoload_resister(array('class_object', 'load_func')); //类和静态方法
sql_autoload_resister('class_object::load_func'); //类和方法的静态调用 //php 5.3之后,也可以像这样支持匿名函数了。
spl_autoload_register(function($className){
if (is_file('./lib/' . $className . '.php')) {
require './lib/' . $className . '.php';
}
});

函数加载 spl_load_func.php

<?php
function load_func($classname) {
require $classname.'.php';
} spl_autoload_register('load_func'); $stu = new student();
?>

类加载 spl_load_class.php
类加载的方式必须是static静态方法

<?php
class load_class {
public static function load($classname) {
require $classname.'.php';
}
}
// 2种方法调用
spl_autoload_register(array('load_class', 'load'));
spl_autoload_register('load_class::load'); $stu = new student(); // php会自动找到student类并加载
?>

最新文章

  1. Smart Tag——DevExpress WPF初探
  2. 由12306动态验证码想到的ASP.NET实现动态GIF验证码(附源码)
  3. linux下logrotate 配置和理解
  4. mysqldump: Got error: 1556: You can&#39;t use locks with log tables. when using LOCK TABLES
  5. Javascript 探路
  6. how to install git 1.8 rpm
  7. Java文件压缩分割(待)
  8. Intellij IDEA 2017集成MyBatis三剑客
  9. React文档翻译 (快速入门)
  10. jquery各种事件使用方法总结(from:天宇之游)
  11. Yarn篇--搭建yran集群
  12. majingwei 利用xml导出word文件---换行
  13. php hash_file
  14. 谈谈Java中的代理模式
  15. stock
  16. banner轮播无缝滚动 jq代码
  17. ORA-00257: archiver error. Connect internal only, until freed【日志归档清理】
  18. MVC控制器使用总结
  19. MPAndroidChart market右边显示不全问题
  20. Django安装(第一个项目)

热门文章

  1. Codeforces Round #503 (by SIS, Div. 2)-C. Elections
  2. PairProject 电梯调度 【附加题】
  3. Filter学习:项目第八阶段
  4. node的读写流
  5. [转帖]Tomcat目录结构详解
  6. [转帖]Intel新一代Xeon完整曝光
  7. Pyhton语句
  8. Linux基础学习(2)--Linux系统安装
  9. 获取或操作DOM元素特性的几种方式
  10. Java代码redis基础操作