细说php类库自动加载

细说php类库自动加载

ID:27719234

大小:313.00 KB

页数:14页

时间:2018-12-05

细说php类库自动加载_第1页
细说php类库自动加载_第2页
细说php类库自动加载_第3页
细说php类库自动加载_第4页
细说php类库自动加载_第5页
资源描述:

《细说php类库自动加载》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、细说“PHP类库自动加载”--覃健祥(吴笑)2013.1注1:文档中涉及的国内外框架,我只在2006年-2008年粗浅地看过文档,做过Hello World基准性能测试(CakePHP,Solar,Yii,QeePHP,ThinkPHP),用其中少数几个实际 做过项目(CodeIgniter,ZendFramework,Symfony),我对它们的自动加载技术的评述也是 以当年版本为基础的。时过境迁,有不少框架的代码发生了翻天覆地的变化,观众朋友请不 要将这个文档作为你选择框架的依据。注2:文档中所示的代码段仅用于表达思路,关键代码会用粗体显示并加下划线。为了 文档篇幅不

2、至于太长,以及观众朋友不被过多的代码分散注意力,这些代码片段故意省略了 (与要表达的主题思路不太相关的)很多细节。因此,它们一般不能运行,需要详细可运行 代码的话,请看文档中提及的开源代码地址,或者自行编写。黑话解释什么是“类库文件”本文档中所说的类库文件是指PHPlibrary文件,被包含(include/require)的公共文件, 他们通常只定义一些class(包括Class,AbstractClass,Interface)或者function。当然从技术上说,一个文件里如果即有Class定义,也有游离于Class方法体之外的直接 执行语句(如echo“hellow

3、orld”;)也是可以视为类库文件的,只是这种写法不符合好的编码规范。什么是“自动加载”在PHP代码中,不需要显式地使用文件路径将类库文件包含进来,便可使用该文件中定 义的类库,这种技术称作自动加载。以下几种方式都是自动加载:•$db=newDb();•$this->load->library(“Db”);$db=newDb();•Zend::load(“Zend_Db”);$db=newZend_Db();•import(“Zend.Db”);$db=newZendDb();为什么要自动加载在传统的PHP编程实践中,我们一直用include/require来包含类库文件

4、,这种文件包含 通常会有如下问题:目录名和文件名变化引起程序代码变化当类库文件目录名或者文件名需要更改的时候,所有include了这个文件的php文件也要随着修改,这加大了源代码目录结构重构的负担。Windows和Unix(Linux/MacOS)对文件路径大小写、目录分隔符(斜线和反斜线)、不 可见字符(如空格)的处理不同,也使得PHP程序员需要花费相当一部分精力来应对文件 名和文件路径问题。相对路径的性能问题我们不会用hardcode把类库文件的绝对路径写死在代码里,于是采用相对路径。一种做法是设置php.ini和include_path值,然后给include()传

5、入一个相对路径,Zend Framework和Yahoo!就是这样做的,这种方案存在显而易见的性能问题,include_path的值越 多,性能损失就越大。包含文件时使用相对路径也会让APC,eAccelerator等OpcodeCache 不能有效地缓存他们。(php引擎处理include_path的机制参见http://www.php.net/manual/en/ini.core.php#ini.include-path)假设在ini文件里include_path=.:/usr/share/pear:/home/admin/taobao,项目里通常要写 set_inc

6、lude_path(get_include_path().“:/var/www/my_proj/zend_framework”) ,include(“Zend.php”)时,PHP引擎会依次去./(即当前目录)、/usr/share/pear、/home/admin/taobao、/var/www/my_proj/zend_framework寻找Zend.php, 悲剧的是,往往在最后一个目录才会找到(前面的目录都是系统默认的,最后的才是项目中 set_include_path设定的),前面的三次尝试导致了性能很差,而且,根据我的测试, file_exists($file),

7、当$file不存在时,消耗的时间远大于$file存在的情况。include的时候,判断 文件是否存在可能也是这个原理(求验证)。另一种流行的方法是利用"__FILE__"魔术变量取得应用的根路径,include的时候使用基 于“应用根路径”的绝对路径,如include($appRoot."conf/db.php"),这个方法很好的解决了 相对路径带来的性能问题,CakePHP,Symfony,Lotusphp等框架用的这种方案。类库文件间相互依赖的问题类库文件之间存在依赖,为了保证运行时不出现“类定义找不到”的情况,类库文件会 用

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。