PHP高级学习等自动加载机制原理分析
本文说明了PHP类的自动加载机制。分享给大家参考,如下:
前言
我们通常在PHP的主流框架中很好地编写一个类,只需要编写相应的命名空间或者直接实例化该类就可以实现该类的使用。不需要用require和include以原生方式逐个引入和包含类文件,这归功于PHP的自动类加载机制,这也是本文讨论的要点。
一.概念
在PHP代码中,您可以使用文件中定义的类库,而无需显式使用文件路径来包含类库文件。这种技术被称为自动加载。
当使用一个类或一个定义了命名空间的类时,只需要直接实例化它。PHP机制在类库中找到类文件进行路径介绍,如果找不到就抛出异常。
其次,PHP实现了类的自动加载方法
1.使用_ _自动加载方法。当程序中没有直接引入新类时,php执行引擎会自动调用这个方法。
因此,只要在用这种方法编写的类的路径中引入逻辑,它就可以自动加载到类中并实例化。如果仍然找不到,将引发异常。
Void __autoload (string $class)在PHP5.3之前,__autoload函数引发的异常无法被catch语句块捕获,并将导致致命错误。从PHP5.3开始,可以抛出用户定义的异常,然后可以使用用户定义的异常类。__autoload函数可以递归地自动加载自定义异常类。
2.使用spl_autoload_register(),该函数可以将给定的函数注册为__autoload的实现。例如,首先在队列中注册要加载的类作为该函数的参数,在调用__autoload时,从队列中获取该函数并导入完成实例化。
bool spl_autoload_register ([可调用$autoload_function [,bool $throw=true [,bool $prepend=false ]])
特点:
(1)spl_autoload_register()提供了一种更灵活的自动加载类的方法(在同一个应用程序中,可以支持任意数量的加载器,比如第三方库中的加载器);
(2)该功能可以注册任意数量的自动加载器,使用未定义的类和接口时自动卸载。通过注册自动加载器,脚本引擎有最后一次机会在PHP失败之前加载所需的类。
(3)当使用多个spl_autoload_register方法时,php会自动依次调用注册的方法。第三个参数是控制将注册的方法放在队列的前面还是后面。
注意:建议使用spl_autoload_register实现类的自动加载,在较高版本的PHP中将丢弃__autoload函数。您可以使用spl注册多种自动加载方法。PHP引擎的规则是,如果执行第一个自动加载方法,找不到类定义,但是尝试执行第二个自动加载方法,以此类推。
二、PHP类自动加载的意义
1.与绝对路径引入的类的文件路径相比,当类库的目录名或文件名需要更改时,所有包含该文件的php文件都无需修改,避免了增加源代码目录结构重构的负担;
2.与在php.ini的include_path中引入类的文件路径相比,自动加载机制可以省去很多性能问题;
3.虽然性能类似于通过__FILE__ magic方法引入相对类路径,但自动加载机制可以防止或减少在文件各处随机使用require_once和include_once,不关心类之间相互依赖的引入顺序。
4.多个类别名称重复或同一应用程序目录和子目录下名称重复的解决方案:
(1)确保类名在1)app中不重复。这要求框架支持自定义路由器规则并更改默认模块和操作的名称;对app代码也有要求。
(2)app中使用了名称空间。虽然简短的类名仍然重复,但是带有名称空间的完整类名并没有重复;
三、注意要点
1.在PHP的CLI交互模式下不能使用类的自动加载;
2.类的搜索顺序:优先查找手动包含或需要的类,如果找不到则采用类的自动加载机制;
3.如果类名用于call_user_func(),它可能包含一些危险的字符,例如./.建议此类功能不要使用用户的输入,至少要验证输入。
更多对PHP相关内容感兴趣的读者可以查看本网站的话题:《php面向对象程序设计入门教程》、《PHP基本语法入门教程》、《PHP运算与运算符用法总结》、《PHP网络编程技巧总结》、《PHP数组(Array)操作技巧大全》、《php字符串(string)用法总结》、《php+mysql数据库操作入门教程》、《php常见数据库操作技巧汇总》、0103010。
希望本文对PHP编程有所帮助。
版权声明:PHP高级学习等自动加载机制原理分析是由宝哥软件园云端程序自动收集整理而来。如果本文侵犯了你的权益,请联系本站底部QQ或者邮箱删除。