自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,下面看具体的使用方法。
在PHP开发过程中,如果希望从外部引入一个class,通常会使用include和require方法,去把定义这个class的文件包含进来,但是这样可能会使得在引用文件的新脚本中,存在大量的include或require方法调用,如果一时疏忽遗漏则会产生错误,使得代码难以维护。
自PHP5后,引入了__autoload这个拦截器方法,可以自动对class文件进行包含引用,通常我们会这么写:
function __autoload($className) {
include_once $className . '.class.php';
}
$user = new User();
当PHP引擎试图实例化一个未知类的操作时,会调用__autoload()方法,在PHP出错失败前有了最后一个机会加载所需的类。因此,上面的这段代码执行时,PHP引擎实际上替我们自动执行了一次__autoload方法,将User.class.php这个文件包含进来。
在__autoload函数中抛出的异常不能被catch语句块捕获并导致致命错误。
如果使用 PHP的CLI交互模式时,自动加载机制将不会执行。
当你希望使用PEAR风格的命名规则,例如需要引入User/Register.php文件,也可以这么实现:
//加载我
function __autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . 'php';
}
$userRegister = new User_Register();
这种方法虽然方便,但是在一个大型应用中如果引入多个类库的时候,可能会因为不同类库的autoload机制而产生一些莫名其妙的问题。在PHP5引入SPL标准库后,我们又多了一种新的解决方案,spl_autoload_register()函数。
此函数的功能就是把函数注册至SPL的__autoload函数栈中,并移除系统默认的__autoload()函数。一旦调用spl_autoload_register()函数,当调用未定义类时,系统会按顺序调用注册到spl_autoload_register()函数的所有函数,而不是自动调用__autoload()函数,下例调用的是User/Register.php而不是User_Register.class.php:
//不加载我
function __autoload($className) {
include_once $className . '.class.php';
}
//加载我
function autoload($className) {
$file = str_replace('/', DIRECTORY_SEPARATOR, $className);
include_once $file . '.php';
}
//开始加载
spl_autoload_register('autoload');
$userRegister = new User_Register();
在使用spl_autoload_register()的时候,我们还可以考虑采用一种更安全的初始化调用方法,参考如下:
view sourceprint?
//系统默认__autoload函数
function __autoload($className) {
include_once $className . '.class.php';
}
//可供SPL加载的__autoload函数
function autoload($className) {
$file = str_replace('_', DIRECTORY_SEPARATOR, $className);
include_once $file . '.php';
}
//不小心加载错了函数名,同时又把默认__autoload机制给取消了……囧
spl_autoload_register('_autoload', false);
//容错机制
if(false === spl_autoload_functions()) {
if(function_exists('__autoload')) {
spl_autoload_register('__autoload', false);
}
}
技巧:在Unix/Linux环境下,如果你有多个规模较小的类,为了管理方便,都写在一个php文件中的时候,可以通过以ln -s命令做软链接的方式快速分发成多个不同类名的拷贝,再通过autoload机制进行加载。
转自:http://www.html.org.cn/develop/php/jiqiao/view53727.html
分享到:
相关推荐
2. **Composer**:使用 Composer 进行依赖管理,它支持自动加载,并能根据 PSR-4 规范自动配置`__autoload`,使项目更加标准和可维护。 3. **避免过多的`require`/`include`**:过度依赖显式引入文件可能导致代码...
PHP的自动加载机制极大地简化了大型项目中的文件管理,使得我们可以按需加载类,降低了内存消耗。`__autoload`虽然简单易用,但灵活性不足;而`SPL`的`spl_autoload`系列函数则提供了更加灵活和强大的自动加载解决...
PHP的自动加载机制是PHP5引入的一个特性,它解决了在大型项目中处理类自动加载的问题,提高了开发效率和程序性能。在此机制出现之前,程序员需要手动包含所有可能用到的类文件,这不仅导致了代码重复和冗余,还容易...
总结来说,PHP的autoload与spl_autoload自动加载机制大大简化了面向对象编程中的类管理问题,使得开发者不需要手动包含每一个类文件,提高了开发效率和程序的可维护性。通过spl_autoload_register()注册的自动加载...
为了解决这一问题,PHP提供了两种自动加载机制:`__autoload()` 和 `spl_autoload_register()`。本文将详细介绍这两种方法的工作原理以及如何在实际项目中运用它们来提高代码的可维护性和扩展性。 #### 二、__...
PHP自动加载的autoload机制是PHP面向对象编程中一个重要的特性,它能够在运行时自动加载指定的文件,而无需手动...本示例虽然没有使用PSR-4标准,但是其基础概念与PSR-4相辅相成,为理解自动加载机制打下了良好的基础。
使用SPL Autoload,我们可以方便地管理和组织多个自动加载函数,避免了单一`__autoload()`函数的复杂性。此外,SPL Autoload还支持在类文件的扩展名上进行配置,可以根据不同类库的命名规范灵活处理。 总结来说,...
在PHP5及以后的版本中,引入了更加强大和灵活的自动加载机制,即通过spl_autoload_register()函数来注册一个或多个自动加载函数,从而替代__autoload()函数。开发者可以定义多个自动加载函数,并将它们注册到 SPL ...
为了解决这个问题,我们可以使用__autoload()函数或者 spl_autoload_register() 函数来实现自动加载机制。当尝试使用未定义的类时,这些函数会被调用,并尝试找到并包含相应的类文件。 第一种方式是使用传统的__...
在PHP编程中,类的自动加载机制是一种非常重要的特性,它允许开发者在使用类时无需显式地包含类文件。这种机制使得代码更加简洁、可维护,并提高了性能。以下是关于PHP类自动加载机制的详细解释: 一、自动加载概念...
在PHP编程中,类的自动加载机制是一种非常实用的功能,它允许我们在需要使用某个类时自动引入对应的类文件,从而避免手动地一个一个去require或include。本文将深入探讨PHP类的自动加载机制的实现方法。 首先,让...
总结来说,PHP的自动加载机制是提高代码可维护性、减少冗余引用的关键技术。通过合理地编写和使用自动加载函数,开发者能够创建出更加整洁、高效的代码库,特别是在API开发中,这种机制更是不可或缺。
自动加载机制允许我们无需显式地使用`require`或`include`来引入类文件,而是当尝试访问尚未定义的类时,PHP会自动调用预先注册的加载函数。 ### `spl_autoload_register`函数介绍 `spl_autoload_register`函数的...