自动加载(phalcon\Loader)

转载请注明来源

一、php文件引入

通过 include() 或 require() 函数,可以在PHP程序执行之前在该文件中插入一个文件的内容。

区别: 处理错误的方式不同。 include() 函数会生成一个 警告(但是脚本会继续执行),而 require()函数会生成一个 致命错误(fatal error)(在错误发生后脚本会停止执行)

* 正因为在文件不存在或被重命名后脚本不会继续执行,因此我们推荐使用 require() 而不是 include()。

二、php类自动加载

参考文章: php手册和 PHP的类自动加载机制

在php5之前,各php框架实现类的加载,一般要按照某种约定实现一个 遍历目录,自动加载符合约定条件的文件类或函数。因此在php5之前类的使用并没有现在频繁。

在php5之后,当加载php类的时候,如果类所在文件夹并没有被包含进来或是类名出错时,Zend引擎会自动调用 __autoload函数。__autoload函数需要用户自己实现。

在php5.1.2版本之后,可以使用 spl_autoload_register函数自定义加载处理函数。当没有调用此函数,默认情况下会使用spl自定义的spl_autoload函数。

1. php自动加载之__autoload function __autoload($className) { $file = $className . '.php'; if (is_file($file)) { require($file); }else{ echo 'no this ' . $className . ' class file'; }}$demo = new Demo();

事实上,我们可以看到 __autoload至少需要做三件事(“ 三步走”),它们分别是: 根据类名确定类的文件名。

确定类文件所在路径,上例用的是中用的是相对定位,我们的测试文件其实在同一目录下。

将指定类所在文件加载到程序中。

在第一步和第二步中,我们必须约定类名与文件的 映射方法,只有这样我们才能够依据类名找到其所对应的文件,实现加载。

因此__autoload自动加载中,最重要的就是 指定类名与其所在文件的对应关系。当有大量的类需要包含进来的时候,我们只需要 确立相应的规则,然后 将类名与其对应的文件进行映射,就能够实现 惰性加载(lazy loading)了。

Tip:spl_autoload_register() 提供了一种更加灵活的方式来实现类的自动加载。因此,不再建议使用 __autoload() 函数,在以后的版本中它可能被弃用。

2. php自动加载之spl_autoload_register

引言:如果在一个php系统实现中,使用了很多的其他类库,这些类库可能是由不同的工程师进行开发的,因此类名与其所在文件的映射规则不尽相同。这时候如果要实现类库的自动加载,就必须在__autoload函数中将所有的映射规则全部实现。这就会导致__autoload会非常复杂,甚至无法实现。同时还会使得__autoload函数十分臃肿。为将来系统的维护和性能带来很大的负面影响。( __autoload的弊端)

spl_autoload_register:

注册给定的函数作为__autoload的实现。简单来说就是将函数注册之SPL的__autoload函数栈中,并移除系统默认的__autload()函数。 function __autoload($className) { echo 'autload class:', $className, '

'; } function classLoader($className) { echo 'SPL load class:', $className, '

'; } spl_autoload_register('classLoader'); new Test();//结果:SPL load class:Test

Tip: 如果在你的程序中已经实现了__autoload()函数,它必须 显式注册到__autoload()队列中。因为 spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload()或spl_autoload_call()。

相比于__autoload只能够定义一次。spl_autoload_register()函数可以 定义多个autoload函数。因为spl_autoload_register创建了autoload函数队列,该队列按照定义的先后顺序逐个执行。 function __autoload($className) { echo 'autload class:' . $className . '

'; } function classLoader($className) { echo 'SPL load class:' . $className . '

'; } spl_autoload_register('classLoader'); $demo = new Demo();//结果:SPL load class:Demo

函数说明

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] ) autoload_function【可选】添加到自动加载栈的函数。默认为spl_autoload()。 还可以调用spl_autoload_register()函数以注册一个回调函数,而不是为函数提供一个字符串名称。如提供一个如array('class','method')这样的数组,使得可以 使用某个对象的方法。

throw【可选】无法成功注册时,是否抛出异常

prepend【可选】是否将将该函数添加到队列之首,而不是队列的尾部。

备注:SPL自动加载功能是由spl_autoload() ,spl_autoload_register(), spl_autoload_functions() ,spl_autoload_extensions()和spl_autoload_call()函数提供的。

三、Phalcon的类自动加载

Phalcon\Loader 通用类加载器(Universal Class Loader),意在根据协议帮助项目自动加载项目中的类(This component helps to load your project classes automatically based on some conventions)。Phalcon支持四种类加载方式,先后顺序分别是注册类名、注册命名空间、注册前缀和注册文件夹的方式。

Phalcon的默认文件后缀为php,当然你自己也可以配置(setExtensions())。

1 . 注册类名 registerClasses( array( "Some" => "library/OtherComponent/Other/Some.php", "Example\Base" => "vendor/example/adapters/Example/BaseClass.php", ));$loader->register(); // i.e. library/OtherComponent/Other/Some.php$some = new Some(); 最快的自动方法

不利于维护

具体实现: 判断是否有类被注册。

判断需要加载的类是否被注册,如果已注册则加载其对应路径文件。

2. 注册命名空间 registerNamespaces( array( "Example\Base" => "vendor/example/base/", "Example\Adapter" => "vendor/example/adapter/", "Example" => "vendor/example/", ));$loader->register();// vendor/example/adapter/Some.php$some = new Example\Adapter\Some();

使用命名空间或外部库组织代码时,你可以利用注册命名空间的方式来自动加载其包含的库。

对于命名空间对应的路径,要其末尾加一个斜杠。

具体实现: 判断是否有命名空间被注册。

判断需要加载的类是否已以注册的命名开始。

例如注册的命名空间为 "Example\Base" => "vendor/example/base/" "Example\Base" => "vendor/example/base/" $test1 = new Example\Base\Test();// vendor/example/base/Test.php $test2 = new Example\Test();// 错误,无法加载。

名称处理:1、去掉命名指定空间前缀。2、将命名空间分隔符 \转换成文件分隔符 /

依据文件拓展名构建完整的文件路径,并判断该文件是否存在,如该文件存在加载。

3. 注册前缀 registerPrefixes( array( "Example_Base" => "vendor/example/base/", "Example_Adapter" => "vendor/example/adapter/", "Example_" => "vendor/example/", )); $loader->register(); // vendor/example/adapter/Some.php$some = new Example_Adapter_Some();

类似于命名空间,从2.1.0开始phalcon将不再支持前缀。

具体实现: 判断是否有前缀被注册。

判断需要加载的类是否已以前缀开始命名。

例如注册的前缀为 "Example_Base" => "vendor/example/base/" "Example_Base" => "vendor/example/base/" $test1 = new Example_Base_Test();// vendor/example/base/Test.php $test2 = new Example_Test();// 错误,无法加载。

名称处理:1、去掉类的前缀。2、将前缀分隔符 _转换成文件分隔符 /

依据文件拓展名构建完整的文件路径,并判断该文件是否存在,如该文件存在加载。

4. 注册文件夹 registerDirs( array( "library/MyComponent/", "library/OtherComponent/Other/", "vendor/example/adapters/", "vendor/example/" )); $loader->register(); // i.e. library/OtherComponent/Other/Some.php$some = new Some();

可以自动加载注册目录下的类文件。但是该方法在性能方面并不被推荐,因为Phalcon将在个文件夹下大量查找与类名相同的文件。在使用注册目录自动加载时,要注意注册目录的相关性,即将重要的目录放在前面。

具体实现: 将类名中的前缀分隔符 _或是命名空间分隔符 \替换成文件夹分割符 /

判断是否有文件夹被注册。

依据文件后缀构建可能的文件路径

例如注册的前缀为 "vendor/example/base/" $test = new Test();// vendor/example/base/Test.php

5. 修改当前策略(Modifying current strategies)

即为当前自动加载数据添加额外的值。 registerDirs( array( "../app/library/", "../app/plugins/" ), true);

注册时添加第二个参数值true,使其与原数组合并。

6. 安全层(Security Layer)

没有进行任何安全检查的自动加载器,如下: 假如我们没有进行任何安全检查时,如果误启了自动加载器,那么恶意准备的字符串就回作为参数访问程序中的重要文件。 Phalcon的做法是删除任何无用的字符串,减少被攻击的可能性。

7. 自动加载事件

在下面的例子中,而不必使用类加载器,使我们获得调试信息的流程操作: registerNamespaces(array( 'Example\\Base' => 'vendor/example/base/', 'Example\\Adapter' => 'vendor/example/adapter/', 'Example' => 'vendor/example/'));//Listen all the loader events$eventsManager->attach('loader', function($event, $loader) { if ($event->getType() == 'beforeCheckPath') { echo $loader->getCheckedPath(); }});$loader->setEventsManager($eventsManager);$loader->register();

Phalcon自动加载支持以下事件:beforeCheckClass,自动加载的过程开始前触发,当返回布尔假可以停止活动操作。

pathFound,当一个类装入器定位触发

afterCheckClass,自动加载的过程完成后触发。

8. 注意事项(Troubleshooting) 自动加载区分大小写。

命名空间或前缀的方式要比文件夹的方式要快得多。

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

phalcon 自动加载_Phalcon自动加载(PHP自动加载)相关推荐

  1. dw自动滚动图片_3分钟搞定图片懒加载

    什么是图片懒加载 图片的懒加载就是在页面打开的时候,不要一次性全部显示页面所有的图片,而是只显示当前视口内的图片,一般在移动端使用(PC端主要是前端分页或者后端分页). 为什么需要懒加载 对于一个页面 ...

  2. DWZ 用dialog调用MVC自动生成的密码修改页面一直出现“数据加载中,请稍等...”和去掉“数据加载中,请稍等”的方法

    在MVC框架中调用JS框架<DWZ富客户端框架>在用dialog调用自动MVC系统自动生成的密码修改页面一直出现"数据加载中,请稍等..."的问题. <a tit ...

  3. 天正启动时加载那些lisp_天正启动时加载那些lisp_启动CAD时自动加载Lisp的工具和插件的方法?...

    互联网上有许多非常有用的CAD插件,可以为绘图带来很多便利. 这些工具可以在手动加载后执行,但是每次使用它们都麻烦. 启动软件时,您可以加载常用插件吗? 当然,有不止一种方法. 方法1:添加到启动组 ...

  4. 天正启动时加载那些lisp_启动CAD时自动加载Lisp的工具和插件的方法?

    互联网上有许多非常有用的CAD插件,可以为绘图带来很多便利. 这些工具可以在手动加载后执行,但是每次使用它们都麻烦. 启动软件时,您可以加载常用插件吗? 当然,有不止一种方法. 方法1:添加到启动组 ...

  5. js 和jQuery(自动执行函数)立即执行函数和页面加载完后执行函数写法

    js 立即执行函数的写法. js 立即执行函数只能用于匿名函数,如果声明了函数名是不可以用立即执行的,通常在函数表达式后加一对小括号()用于立即执行 如果想让函数不被调用的情况下,立即自动执行,需要在 ...

  6. 在一个html加载多个echarts,Echarts一个页面加载多个图表及图表自适应

    Echarts一个页面加载多个图表及图表自适应 模块化加载 //入口 require.config({ paths: { echarts: 'http://echarts.baidu.com/buil ...

  7. python加载项向导_什么是 Python 加载项?

    加载项是一种自定义项,它可以插入到 ArcGIS for Desktop 应用程序(即 ArcMap.ArcCatalog.ArcGlobe 和 ArcScene)中以便提供补充功能以完成自定义任务, ...

  8. 28 Java类的加载机制、什么是类的加载、类的生命周期、加载:查找并加载类的二进制数据、连接、初始化、类加载器、双亲委派模型、自定义类加载器

    28Java类的加载机制 28.1.什么是类的加载 28.2.类的生命周期 28.2.1.加载:查找并加载类的二进制数据 28.2.2.连接 28.2.3.初始化 28.3.类加载器 28.4.类的加 ...

  9. combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...

    AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...

  10. 为此计算机所有用户安装加载项,此网站需要运行以下加载项……如果您信任该网站和该加载项并允许运行该加载项...

    什么是浏览器加载项 加载项是指为浏览器添加扩展功能的特殊软件.提到加载项一般涉及插件.扩展组件.工具栏等,通常是由非微软的第三方厂商编写.有些加载项可以在浏览器中直观地看见.有些则以静默的方式运行于后 ...

最新文章

  1. linux挂载移动硬盘 格式化_linux系统下如何挂载NTFS移动硬盘
  2. opc客户端_组态王作为OPC服务器的使用介绍,欢迎读者阅读
  3. 【Python】一文读懂Python正则表达式常用用法
  4. 少标签数据学习,54页ppt
  5. 光刻机龙头ASML回应韩国建厂:无需过度解读
  6. Java线程池 源码分析
  7. 乐安全 支持x86_国产EDA又进一步!芯华章发布全新仿真技术:x86、ARM等架构通吃...
  8. Windows10 对系统盘C 有效清理
  9. php限制小程序访问,PHP投票小程序,防超时,防IP限制
  10. cap理论具体含义_分布式事务的CAP理论
  11. 计算机等级考试绝对应用,96年4月至210年全国计算机等级考试绝对全收集.docx
  12. wms开发语言c 还是java,专业WMS和普通WMS之间差异有什么呢?
  13. 解决 WSO2 EI 6.0.0~6.6.0 删除带有 Class 的碳应用时提示 ClassNotFoundException 异常
  14. DNF调整建议与新团本策划
  15. visio中图形任意位置添加连接点
  16. android 指纹是否设置,检查Android是否支持指纹识别以及是否已经录入指纹
  17. GoFW|网页加速器
  18. linux右键无法解压gz文件夹,Linux/centos下zip、tar、gz压缩解压命令
  19. 中石油大学22春季《大学英语(四)#》第一阶段在线作业
  20. 男孩子读博好处--转载

热门文章

  1. 匿名者Anonymous 十项大事记
  2. forwarding
  3. 个子矮s弯如何看点打方向图解_科目二s弯怎么看点打方向技巧图解
  4. android入门之Activity 后台启动限制
  5. GC算法精解(五分钟让你彻底明白标记/清除算法)
  6. 群晖docker火狐_群晖docker安装chrome浏览器_动漫台
  7. Microsoft Teams 思维导图的4大好处,你知道怎样创建吗?
  8. 涂鸦小程序——为自己的人生画上一笔
  9. magma测试与安装,使用(含docker配置)
  10. Devcpp、Codeblocks如何设置支持c++11