PHP 实现自动加载
自动载入主要是省去了一个个类去 include 的繁琐,在 new 时动态的去检查并 include 相应的 class 文件。
先上代码:
//index.php
<?php class ClassAutoloader {
public static function loader($className)
{
$file = $className . ".class.php"; if(is_file($file))
{
echo 'Trying to load ', $className, ' via ', __METHOD__, "()\n";
require_once( $file );
}
else
{
echo 'File ', $file, " is not found!\n";
}
} public static function register($autoLoader = '')
{
spl_autoload_register($autoLoader ?: array('ClassAutoloader', 'loader'), true, true);
}
} ClassAutoloader::register(); $obj = new printit();
$obj->doPrint(); ?>
然后是类文件:
//printit.class.php
<?php class PRINTIT { function doPrint() {
echo "Hello, it's PRINTIT! \n";
}
}
?>
实验结果:
$ php index.php
Try to load printit via ClassAutoloader::loader() Hello, it's PRINTIT!
上面的代码中,我们在另外一个文件 printit.class.php 中定义的 printit 类。但是,我们并没有在 index.php 中显性的 include 这个库文件。然后,因为我们有注册了自动加载方法,所以,我们在 new 这个类时,我们的自动加载方法就会按事先定义好的规则去找到类文件,并 include 这个文件。
这也是 ThinkPHP5.1 中 Loader 的基本原理。不过,ThinkPHP 框架中,另外还增加了使用 Psr0、Psr4 规则来查找类文件,以及 Composer 的自动加载。
PS,在官方文档的评论中,看到这样的神级代码:
<?php
spl_autoload_extensions(".php"); // comma-separated list
spl_autoload_register();
?>
让 PHP 自己去寻找文件,据说要比上面指定文件名要快得多。
该评论中举例,1000 classes (10个文件夹,每个有 10个子文件夹,每个文件夹有 10 个类)时候,上面指定文件名的方式耗时 50ms,而这两句代码只花了 10ms。
不过我猜,第一句让 PHP 已经做了缓存,所以,这种方式应该是拿内存换了速度。
PHP 实现自动加载的更多相关文章
- BPM配置故事之案例3-参与者与数据自动加载
这才过了两天,阿海又来了. 阿海:公司决定改进管理方式,以后物资申请的申请人和申请部门要写具体使用人的名字和部门了. 小明:不是要让我改回去吧? 阿海:那太麻烦了,你能不能把申请人改成选择,选好人自动 ...
- Composer概述及其自动加载探秘
composer概述 一开始,最吸引我的当属 Composer 了,因为之前从没用过 Composer . Composer 是PHP中用来管理依赖关系的工具,你只需在自己的项目中声明所依赖的外部工具 ...
- 让Lua自己把文件夹下面的所有文件自动加载起来吧
没有想到我也做了一回标题党.其实这里边说的自动还是有夸大其词的部分.其实只是指定文件夹,然后根据指定文件夹数据,加载目录下边的内容而已. 怎么来进行Lua文件的加载 一般情况下,相关的功能需要给他创建 ...
- 如何实现一个php框架系列文章【3】支持psr4的自动加载类
psr4自动加载规范https://github.com/PizzaLiu/PHP-FIG/blob/master/PSR-4-autoloader-cn.md 我们把第三方使用psr规范的类库放在v ...
- PHP 自动加载规范PSR-4
.note-content { font-family: "Helvetica Neue", Arial, "Hiragino Sans GB", STHeit ...
- 构建自己的PHP框架之自动加载类中详解spl_autoload_register()函数
在了解这个函数之前先来看另一个函数:__autoload. 一.__autoload 这是一个自动加载函数,在PHP5中,当我们实例化一个未定义的类时,就会触发此函数.看下面例子: printit.c ...
- jquery 页面滚动到底部自动加载插件集合
很多社交网站都使用无限滚动的翻页技术来提高用户体验,当你页面滑到列表底部时候无需点击就自动加载更多的内容.下面为你推荐 10 个 jQuery 的无限滚动的插件: 1. jQuery ScrollPa ...
- 自动加载dll,加载dll中程序集的信息。
自动加载程序集,解析程序集中的方法. private static object Invoke(string lpFileName, string Namespace, string ClassNam ...
- 【PHP面向对象(OOP)编程入门教程】23.自动加载类 __autoload()函数
很多开发者写面向对象的应用程序时,对每个类的定义建立一个 PHP 源文件.一个很大的烦恼是不得不在每个脚本(每个类一个文件)开头写一个长长的包含文件的列表. 在软件开发的系统中,不可能把所有的类都写在 ...
- autocad2008+C#2008开发中设置自动加载dll
一.复制编译后的dlll路径,比如我的是D:\zjy\cad开发\学习\宗地图\bin\Debug\zd.dll 二.随便找个地方新建一个记事本,在记事本中写入以下内容: (command " ...
随机推荐
- 给定两个字符串 s 和 t,它们只包含小写字母。 字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母。 请找出在 t 中被添加的字母。
给定两个字符串 s 和 t,它们只包含小写字母.字符串 t 由字符串 s 随机重排,然后在随机位置添加一个字母.请找出在 t 中被添加的字母. 示例: 输入: s = "abcd" ...
- 使用entitiy
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.D ...
- scrapy Formrequest用法(豆瓣登录案例)
# -*- coding: utf-8 -*-import scrapyfrom scrapy.http import Request,FormRequest class DbSpider(scrap ...
- Codeforces 948D Perfect Security 【01字典树】
<题目链接> 题目大意: 给定两个长度为n的序列,可以改变第二个序列中数的顺序,使得两个序列相同位置的数异或之后得到的新序列的字典序最小. 解题分析: 用01字典树来解决异或最值问题.因为 ...
- Django之Form组件(一)
Django之Form组件(一) Django的Form主要具有一下几大功能: 生成HTML标签 验证用户数据(显示错误信息) HTML Form提交保留上次提交数据 初始化页面显示内容 基本操作:字 ...
- vim编辑器第二天
编辑模式的进入: i :在光标所在的字符前插入 a :在光标所在的字符后插入 o :在光标所在的行的下面一行插入 I : 在光标所在的行的行首插入,如果行首有空格则在空格后面开始插入 A :在光标 ...
- 安装mysql以及修改mysql字符集问题
1.安装mysql sudo apt-get install mysql-server sudo apt-get install mysql-client 2.部分命令: sudo service ...
- 2019-1-9 c#时间格式
DateTime now=DateTime.Now; //获取拼接形式的,精确到毫秒 now.ToString("yyyyMMddHHmmssfff"); //获取时间戳 自公元0 ...
- Android应用程序性能优化Tips
对于我们设计的应用需要做到以下特征:build an app that's smooth, responsive(反应敏捷), and uses as little battery as possib ...
- redis(六)
安装包 到中文官网查找客户端代码 联网安装 sudo pip install redis 使用源码安装 unzip redis-py-master.zip cd redis-py-master sud ...