归纳一下php加载文件3种方式:
1、include,include_once,requice,requice_one常规加载
2、__autoload()
3、spl_autoload_register()
- 最常规的加载方法,在小项目小代码里使用的是 4个常用函数 include, include_once,require, require_once,他们之间的区别是
~incluce在用到时加载
~require在一开始就加载
~_once后缀表示已加载的不加载
此外,include要包括的文件找不到时会给一个警告,require会报一个严重的错误,要求较高的可以采用require。
//No.1
require('config.php');
require('login.php');
$a = new config();
- 引入__autoload的魔术方法进行加载,引入的原因是单项目较大,文件较多的时候如果采用require一个一个包含的话,耗费时间又使得代码冗长。使用autoload在new对象时会按照魔术方法中的规则自动加载。
//N0.2
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
$a = new config();
$b = new login();
- 在大型系统的开发中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能 会非常复杂,甚至无法实现。
spl_autoload_register() 满足了此类需求。 它实际上创建了 autoload 函数的队列,按定义时的顺序逐个执行。相比之下, __autoload() 只可以定义一次。
//No.3
function loader($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}
}
spl_autoload_register('loader');
$a = new config();
$b = new login();
//No.4
class Loader{
public static function loadClass($class) {
$file = $class . '.php';
if(is_file($file)) {
require_once($file);
}
}
}
spl_autoload_register(array('Loader', 'loadClass'));
$a = new config();
$b = new login();
此外根据php.net 给出的意见
php5.0 之后开始采用__autoload来自动加载类,但在使用过程中发现__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误。(5.3.0之前的版本)所以建议采用spl_autoload_register
//N0.2 自动加载在 PHP 5.3.0+ 中的异常处理
/**
* 在 5.3.0 版之前,__autoload 函数抛出的异常不能被 catch 语句块捕获并会导致一个致命错误。
* 从 5.3.0+ 之后,__autoload 函数抛出的异常可以被 catch 语句块捕获,但需要遵循一个条件。
* 如果抛出的是一个自定义异常,那么必须存在相应的自定义异常类。
* __autoload 函数可以递归的自动加载自定义异常类。
**/
function __autoload($class)
{
$file = $class . '.php';
if (is_file($file)) {
require_once($file);
}else{
// echo "Want to load $class.\n";
// throw new Exception("Unable to load $class.");
// / **
// * 5.3版本不支持自定义异常类,只能这样处理
echo "Want to load $class.\n";
throw new MissingException("Unable to load $class.");
// */
}
}
try {
$obj = new test();
} catch (Exception $e) {
echo $e->getMessage(), "\n";
}