PHP5中比较好用的功能:动态加载类文件

PHP中的类加载并没有JAVA中那么方便,而且PHP是过程夹面向对象的语言,方式和JAVA很大的不同。


一般情况下都是一个类一个文件,然后在用到时require或include一个类文件,比如在Page类中如果要用到Meta类,那么要在类的前边加上一句:
file Page.php
[code]
require("Meta.php");

class Page {
//....code
}
[/code]

但是如果同时又有一个类Robbin要用到呢?用上面的方法?没问题。
file Robbin.php
[code]
require("Meta.php");

class Robbin {
//.....code
}
[/code]

如果有个Main类要用到上面两类呢?用上面的方法:
file Main.php
[code]
require("Page.php");
require("Robbin.php");

class Main {
//....code
}
[/code]

结果一运行,出错,错误信息是,重复定义的类别Meta。为什么会这样呢?哦,原来是这样的,因数require/include的功能是把某文件包含在本程序文件中,那么当Robbin和Page都包含Meta.php文件时,那么就会出现两个Meta类的定义,也就会发生错误。

有些PHPer就会用到require_once/include_once这样的指令,虽然是解决了上面的问题,但是并不是最好的方法。

又有另一种方案,也就是说,不在任何类中加入require这样的指令,而在最顶层使用到这个类时再加入,比如Main.php文件中可以这样定义:
file Main.php
[code]
require("Robbin.php");
require("Page.php");
require("Meta.php");

class Main{
//....code
}
[/code]

但是这样常常会遇到问题,什么问题,就是有些类,比如说上层类使用到比较底层的类时,我们不可能全部知晓,那么我们只能看出错信息一个又一个的把它们require进来,但是这样也太麻烦了,有没有更为方便的方法呢?

有!
方案如下:
定义一个系统的预定义函数 __autoload($classname)。
这是PHP5中的一个新特性,可以让各位PHP减少用require的次数,简直就是太棒了。
参数$classname是类名,系统在未找到这个类时,会先调用__autoload函数,因为__autoload函数是由我们实现的,所以我们必须根据$classname来include相关的文件(不用require是有理由的,后面再说)。比如我现在这个项目中用到的__autoload的定义:
file auto_loader.php
[code]
function __autoload($classname) {
if (preg_match('/\w*Helper$/', $classname)) {
include("classes/" . $classname . ".php");
} elseif (preg_match('/\w*Config$/', $classname)) {
include("configs/" . $classname . ".php");
} elseif (preg_match('/\w*Exception$/', $classname)) {
include("classes/exception/" . $classname . ".php");
} else {
include("classes/utils/" . $classname . ".php");
}
}
[/code]

只要在最顶层的程序文件中加入这个,那么我只要记得类名就可用这个类,而不用require任何类文件,因为系统已经自动调用__autoload函数把相关的文件include进来了。

回答前面那个问题,那么为什么不用require而用include呢?PHPer都应该知道,include是动态执行的,也就是说执行到include这个语句时才把文件包含进来,而require是预先执行的,也就是说,在php文件在执行前就已经把相关的文件包含进来,组成一个大文件,如果上面的include改成require,当然也可以执行,但是这样并不会达到好的性能。

这样就鼓励PHP程序员们多使用类,而不是函数,这样的话就可以减少require的麻烦。

其实PHP是很好用的,只是有些缺点,一次请求就是一次过程,每一次请求都不能共享数据,这造成一些性能问题,而这些在JAVA世界没有,所以向往JAVA。

----

今天心很难过,坚持着,会好起来的。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值