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。
----
今天心很难过,坚持着,会好起来的。
一般情况下都是一个类一个文件,然后在用到时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。
----
今天心很难过,坚持着,会好起来的。