2015-05-27
一、php中实现自动加载的方法
使用require,include,require_once,include_once手工进行加载。
使用__autoload来进行自动加载
使用spl的autoload来实现自动加载
手工加载的实现:
当需要加载的文件很少的时候我们可以使用第一个来完成。这样做很简单也没问题。
[php]
require_once 'a.php';
require_once 'b.php';
require_once 'c.php';
require_once 'a.php';
require_once 'b.php';
require_once 'c.php';
但是当需要加载文件很多的时候这样做还行吗?需要写十个,二十个require_once 或者更多的时候我们该怎么办?
这个时候我们可以使用__autoload方法来简化我们的代码。
__autoload加载的实现:
我们在test目录下创建一个in.php文件,内容如下。
[php]
echo '我是test下面的in.php<br />';
echo '我是test下面的in.php<br />';然后在test目录下创建一个loader.php,内容如下。
[php]
// 需要重载__autoload方法,自定义包含类文件的路径
function __autoload($classname)
{
$class_file = strtolower($classname).".php";
if (file_exists($class_file)){
require_once($class_file);
}
}
@$test = new in(); // 执行到这里会输出 <SPAN style="FONT-FAMILY: Arial, Helvetica, sans-serif">我是test下面的in.php</SPAN>
// 需要重载__autoload方法,自定义包含类文件的路径
function __autoload($classname)
{
$class_file = strtolower($classname).".php";
if (file_exists($class_file)){
require_once($class_file);
}
}
@$test = new in(); // 执行到这里会输出 我是test下面的in.php没问题,成功了!我们还可以创建其他的文件来进行加载,但是当需要的文件很多需要区分目录的时候怎么办?
这时我们需要修改loader.php可以使用映射来找到要加载的文件。
[php]
function __autoload($class_name) {
$map = array(
'index' => './include/index.php',
'in' => './in.php'
);
if (file_exists($map[$class_name]) && isset($map[$class_name])) {
require_once $map[$class_name];
}
}
new index();
function __autoload($class_name) {
$map = array(
'index' => './include/index.php',
'in' => './in.php'
);
if (file_exists($map[$class_name]) && isset($map[$class_name])) {
require_once $map[$class_name];
}
}
new index();
这种方法的好处就是类名和文件路径只是用一个映射来维护,所以当文件结构改变的时候,不需要修改类名,只需要将映射中对应的项修改就好了。
但是__autoload在一个项目中只能使用一次,当你的项目引用了别人的一个项目,你的项目中有一个__autoload,别人的项目也有一个__autoload,这样两个__autoload就冲突了.解决的办法就是修改__autoload成为一个,这无疑是非常繁琐的,应用场景单一。
spl的autoload加载实现:
spl的autoload系列函数使用一个autoload调用堆栈,你可以使用spl_autoload_register注册多个自定义的autoload函数,应用场景广泛
spl的自动加载的相关函数
spl_autoload%20是_autoload()的默认实现,它会去include_path中寻找$class_name(.php/.inc)%20Spl_autoload实现自动加载:
在test目录下建立in.php,内容如下
[php]
<?php
class%20in%20{
%20public%20function%20index()%20{
%20echo%20'我是test下面的in.php';
%20}
}
?>
<?php
class%20in%20{
public%20function%20index()%20{
echo%20'我是test下面的in.php';
}
}
?> %20在test目录下建立loader.php,内容如下
[html]
<?php
set_include_path("/var/www/test/");%20//这里需要将路径放入include
spl_autoload("in");%20//寻找/var/www/test/in.php
$in%20=%20new%20in();
$in->index();
<?php
set_include_path("/var/www/test/");%20//这里需要将路径放入include
spl_autoload("in");%20//寻找/var/www/test/in.php
$in%20=%20new%20in();
$in->index();
spl_autoload_register将函数注册到SPL%20__autoload函数栈中,修改loader.php
[php]
function%20AutoLoad($class){
%20if($class%20==%20'in'){
%20require_once("/var/www/test/in.php");
%20}
}
spl_autoload_register('AutoLoad');
$a%20=%20new%20in();
$a->index();
function%20AutoLoad($class){
%20if($class%20==%20'in'){
%20require_once("/var/www/test/in.php");
%20}
}
spl_autoload_register('AutoLoad');
$a%20=%20new%20in();
$a->index();
spl_autoload_register注册多个自定义的autoload函数的应用
首先在test目录下建立mods文件夹并建立inmod.mod.php内容如下:
[php]
<?php
class%20inmod
{
%20function%20__construct()
%20{
%20echo%20'我是mods下的in';
%20}
}
<?php
class%20inmod
{
function%20__construct()
{
echo%20'我是mods下的in';
}
}
%20然后在test目录下建立libs文件夹并建立inlib.lib.php内容如下:
[php]
<?php
class%20inlib
{
%20function%20__construct()
%20{
%20echo%20'我是libs下的in';
%20}
}
<?php
class%20inlib
{
function%20__construct()
{
echo%20'我是libs下的in';
}
} %20最后在test目录下建立loader.php内容如下
[php]
<?php
class%20Loader%20{
%20/**
%20*%20自动加载类
%20*%20@param%20$class%20类名
%20*/
%20public%20static%20function%20mods($class)%20{
%20if($class){
%20set_include_path(%20"/var/www/test/mods/"%20);
%20spl_autoload_extensions(%20".mod.php"%20);
%20spl_autoload(%20strtolower($class)%20);
%20}
%20}
%20public%20static%20function%20libs($class)%20{
%20if($class){
%20set_include_path(%20"/var/www/test/libs/"%20);
%20spl_autoload_extensions(%20".lib.php"%20);
%20spl_autoload(%20strtolower($class)%20);
%20}
%20}
}
spl_autoload_register(array('Loader',%20'mods'));
spl_autoload_register(array('Loader',%20'libs'));
new%20inmod();//输出<SPAN%20style="FONT-FAMILY:%20'Times%20New%20Roman';%20FONT-SIZE:%2014px">我是mods下的in</SPAN>
new%20inlib();//<SPAN%20style="FONT-FAMILY:%20Arial,%20Helvetica,%20sans-serif">输出</SPAN><SPAN%20style="FONT-FAMILY:%20'Times%20New%20Roman';%20FONT-SIZE:%2014px">我是libs下的in</SPAN>
<?php
class%20Loader%20{
%20/**
%20*%20自动加载类
%20*%20@param%20$class%20类名
%20*/
%20public%20static%20function%20mods($class)%20{
%20if($class){
set_include_path(%20"/var/www/test/mods/"%20);
spl_autoload_extensions(%20".mod.php"%20);
spl_autoload(%20strtolower($class)%20);
%20}
%20}
%20public%20static%20function%20libs($class)%20{
if($class){
set_include_path(%20"/var/www/test/libs/"%20);
spl_autoload_extensions(%20".lib.php"%20);
spl_autoload(%20strtolower($class)%20);
%20}
%20}
}
spl_autoload_register(array('Loader',%20'mods'));
spl_autoload_register(array('Loader',%20'libs'));
new%20inmod();//输出我是mods下的in
new%20inlib();//输出我是libs下的in
1
CI框架连接数据库配置操作以及多数据库操作
09-05
2
asp 简单读取数据表并列出来 ASP如何快速从数据库读取大量数据
05-17
3
C语言关键字及其解释介绍 C语言32个关键字详解
04-05
4
C语言中sizeof是什么意思 c语言里sizeof怎样用法详解
04-26
5
最简单的asp登陆界面代码 asp登陆界面源代码详细介绍
04-12
6
PHP中的魔术方法 :__construct, __destruct , __call, __callStatic,__get, __set, __isset, __unset , __sleep,
09-05
7
PHP中的(++i)前缀自增 和 (i++)后缀自增
09-05
8
PHP中include和require区别之我见
09-05
常用dos命令及语法
2014-09-27
将视频设置为Android手机开机动画的教程
2014-12-11
php递归返回值的问题
2014-09-05
如何安装PHPstorm并配置方法教程 phpstorm安装后要进行哪些配置
2017-05-03
java中的info是什么意思
2022-03-24
PHP 教程之如何使用BLOB存取图片信息实例
2014-09-05
IcePHP框架中的快速后台中的通用CRUD功能框架
2014-09-05
单片机编程好学吗?单片机初学者怎样看懂代码
2022-03-21
PHP数组函数array
2014-09-05
学ug编程如何快速入门?
2022-03-17
乐乐捕鱼任达华官方正版下载v10.2.0.0 安卓3d版
休闲益智 579.4M
下载巨兽战场手游下载v3.1.9 安卓版
射击枪战 1.87G
下载放置江湖官方正版下载v2.1.01 安卓版
角色扮演 690.1M
下载口袋吉伊卡哇游戏(Chiikawa Pocket)下载v1.3.0 安卓国际版
角色扮演 458.5M
下载仙剑奇侠传官方手游下载v1.1.86 安卓最新版本
卡牌对战 401.3M
下载文豪与炼金术师游戏(文アル)下载v1.1.60 安卓版
角色扮演 105.9M
下载新盗墓笔记正版手游下载v1.215.890111 安卓版
其它手游 981.5M
下载宝宝爱交通工具游戏下载v9.87.00.01 安卓官方版
其它手游 104.2M
下载北凉悍刀行互通手游下载v1.98.2.003 安卓版
下载
三国志幻想大陆2枭之歌新版本下载v0.0.18 安卓版
下载
狼人杀手游下载v2.14.308 安卓版
下载
自由开火战场中文版下载v1.97.1 官方安卓版
下载
传说对决Aov精英体验服下载v1.58.2.1 安卓最新版
下载
绝地求生轻量版2025官方正版下载v0.27.0 安卓手机版
下载
tft云顶之弈手游下载v15.8.6738244 安卓最新版本
下载
凡人修仙增强现实版手游官方下载v1.0.2 安卓版
下载