phalcon 自动加载_Phalcon自动加载(PHP自动加载),phalcon加载php_PHP教程
Phalcon自动加载(PHP自动加载),phalcon加载php
自动加载(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:
函数说明
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 . 注册类名
php$loader = new\Phalcon\Loader();$loader->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. 注册命名空间
php$loader = new\Phalcon\Loader();$loader->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();
使用命名空间或外部库组织代码时,你可以利用注册命名空间的方式来自动加载其包含的库。
对于命名空间对应的路径,要其末尾加一个斜杠。
具体实现:
3. 注册前缀
php$loader = new\Phalcon\Loader();$loader->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将不再支持前缀。
具体实现:
4. 注册文件夹
php$loader = new\Phalcon\Loader();$loader->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将在个文件夹下大量查找与类名相同的文件。在使用注册目录自动加载时,要注意注册目录的相关性,即将重要的目录放在前面。
具体实现:
5. 修改当前策略(Modifying current strategies)
即为当前自动加载数据添加额外的值。
php//Adding more directories
$loader->registerDirs(array("../app/library/",
"../app/plugins/"),
true);
注册时添加第二个参数值true,使其与原数组合并。
6. 安全层(Security Layer)
没有进行任何安全检查的自动加载器,如下:
php//Basic autoloader
spl_autoload_register(function($className) {if (file_exists($className . '.php')) {require $className . '.php';
}
});
假如我们没有进行任何安全检查时,如果误启了自动加载器,那么恶意准备的字符串就回作为参数访问程序中的重要文件。
php//This variable is not filtered and comes from an insecure source
$className = '../processes/important-process';//Check if the class exists triggering the auto-loader
if (class_exists($className)) {//...
}
Phalcon的做法是删除任何无用的字符串,减少被攻击的可能性。
7. 自动加载事件
在下面的例子中,而不必使用类加载器,使我们获得调试信息的流程操作:
php$eventsManager = new\Phalcon\Events\Manager();$loader = new\Phalcon\Loader();$loader->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)
http://www.bkjia.com/PHPjc/1092699.htmlwww.bkjia.comtruehttp://www.bkjia.com/PHPjc/1092699.htmlTechArticlePhalcon自动加载(PHP自动加载),phalcon加载php 自动加载(phalcon\Loader) 转载请注明来源 一、php文件引入 通过 include() 或 require() 函数,可以在PH...
phalcon 自动加载_Phalcon自动加载(PHP自动加载),phalcon加载php_PHP教程相关推荐
- chrome 自动加载ajax.googleapis,使用Redirector插件解决googleapis公共库加载的问题
最近访问一些面向国外的网站总是会出现ajax.googleaips.com无法加载的情况.以下为加载stackoverflow时的情境: 图1 -无法加载的google公共库 问题的原因是谷歌没有在国 ...
- unity 异步加载网络图片_一个非常好用的AssetBundle资源加载器
Loxodon Framework Bundle是一个非常好用的AssetBundle加载器,也是一个AssetBundle冗余分析工具.它能够自动管理AssetBundle之间复杂的依赖关系,它通过 ...
- eui加载时间长_面试官:为什么 HashMap 的加载因子是0.75?
有很多东西之前在学的时候没怎么注意,笔者也是在重温HashMap的时候发现有很多可以去细究的问题,最终是会回归于数学的,如HashMap的加载因子为什么是0.75? 本文主要对以下内容进行介绍: 为什 ...
- combotree 可以异步加载吗_Unity AssetBundle 资源打包,加载,本地缓存方式,安卓,PC本地加载路径问题...
AssetBundle的定义和作用: 1,AssetBundle是一个压缩包包含模型.贴图.预制体.声音.甚至整个场景,可以在游戏运行的时候被加载. 2,AssetBundle自身保存着互相的依赖关系 ...
- 上拉加载_如何用Vue + Mint UI实现上拉加载更多
引言: 上拉加载更多在移动端不论是在 app 里面还是在页面中都是必不可少的,以下是 mint-ui 中上拉加载更多的总结. 一.在项目中使用 mint-ui 需要先安装 查看官网 (1)安装:npm ...
- java找不到或无法加载主类(cmd java找不到或无法加载主类)
java在CMD中出现"找不到或无法加载主类" class前面加一个public 另外你这个截图不完全不知道输入的对不对 参考示例: public class Hello { pu ...
- go加载python_人生苦短我用python(02)动态加载模块-Go语言中文社区
文章内容为原创,欢迎转载请注明出处 作者: EflyPro->晦明禅师 文章来源:公众号"睿江云计算" 继第一期[人生苦短我用Python系列专栏]发布后,深受广大睿普迷的一 ...
- php 动态加载扩展,仿照PHP的实现简单的扩展动态加载
PHP通过扩展机制,可以方便的实现对PHP的动态扩展,在PHP扩展加载过程中简单的分析了PHP扩展的加载过程,下面可以继续根据PHP的相关实现,实现一个自己的简单的支持扩展的程序. 在PHP中,有个非 ...
- hql懒加载后判断对象是否存在_hibernate延迟加载(懒加载)详解
延迟加载 一.什么是懒加载?他的作用? 延迟加载,也叫懒加载,它是Hibernate为提高程序执行效率而提供的一种机制,即只有真正使用该对象的数据时才会创建. Hibernate中主要是通过代理(pr ...
- 微信怎么自动加好友java_iOS逆向开发之微信自动添加好友功能
这一次,小程演示怎么让一个APP自动地运行,从而代替手工的操作.同样以"微信"以例,实现在一个微信群里面,对所有的成员,自动地一个一个地发出添加好友的请求. 知识点还是之前介绍的东 ...
最新文章
- 全球第五大社交网站,二号员工离职创业,自爆心酸历程!想做10亿美元规模?先活着!...
- python解多项式方程_python – SymPy不能求解四阶多项式方程
- sqlserver 实现伪序列
- 方舟game ini生成器_十一月 XGP 新增双平台游戏:《方舟:生产进化》等
- 内镜碎石术装置行业调研报告 - 市场现状分析与发展前景预测
- 中国AI专利数稳居第一!世界各国AI专利深度盘点
- 是时候放弃循环神经网络了
- 海尔消费金融“增收不增利”:利润不及两年前,曾多次被点名批评
- ffmpeg如何实现MP3转码g711a
- 下载Echarts.min.js和Echart-gl.min.js
- 使用DHT11和51单片机进行温湿度的读取(保证好用版本)
- 重装win7系统显示:无法安装在gpt硬盘上
- Promise的基本用法以及作用
- 设置超过DIV高度范围隐藏结尾... 点击查看全文显示全部
- DOS下安装WinXP方法
- 公共关系礼仪实务章节测试题——公共关系概述(四)
- 软件项目计划管理:三级计划管理体系
- cpu线程测试软件,CPU多线程能力测试_主板评测-中关村在线
- Problematic frame: C [sigar-amd64-winnt.dll+0x14ed4]
- 5000月薪与50000月薪的Linux运维的区别
热门文章
- 成功安装python后、在dos命令行窗口中-python在WIN运行时去掉DOS窗口显示的方法
- 服务器无法远程的原因
- 全球约有 150 亿台设备在运行 Java,收费后还能用吗?
- Android开发中遇到的坑
- 计算机组成原理(笔记)
- 利用python openpyxl库实现对多个excel工作簿的快速汇总
- 第100封“情书”:不完美生活Volume Displacement Shader<Entagma>Houdini 2019
- 警告: [SetPropertiesRule]{Server/Service/Engine/Host/Context} Setting property 'source' to 'org.ecli
- requests Adding certificate verification is strongly advised. See: https://urllib3.readthedocs.io/en
- 2020牛客暑期多校训练营(第九场) 	The Flee Plan of Groundhog