Yaf框架下类的自动加载
前面两篇博客分别讲述了PHP自带的类加载和composer中类的自动加载,其实Yaf框架也实现了基于PSR0和PSR4的类的自动加载。根据我对Yaf下类的自动加载方式的理解写下这篇博客。由于接触Yaf框架时间不长,因此如果有不对之处,还望大家不吝指教。
要理解Yaf框架下类的自动加载方式,还是需要PSR0和PSR4规范作为基础,对于PSR0和PSR4的具体规范,本文不做详细解释。Yaf下类的自动加载可以分为全局类和本地类的自动加载、与MVC框架相关的类的自动加载,下面分别做相应的介绍。
一、Yaf中全局类、本地类的自动加载
首先,说明一下本文中所说的全局类和本地类的区别。
全局类是所谓的公司或部门级别的现有类库,该类可以在多个项目中共同使用,而不只在当前的项目中可用。这些类的路径一般是通过在yaf.liabrary在php的配置文件php.ini中指定。
本地类指的是只应用于本项目的类,这些类所在的路径也可以通过在Yaf的配置文件中通过ap.liabrary指定。在Yaf中可以通过Yaf_Loader::registerLocalNamespace()申明那些本地类的前缀,那么带有该前缀的类,需要在本地的类库中加载。
无论是全局类还是本地类,Yaf中使用PSR0规则进行加载的时候,类名中的"_"都会被转换成目录分隔符“/”。
根据所看过的博客,全局类和本地类的加载规则可总结如下:
- 如果指定yaf.library和产品的application.ini中指定ap.library,那么无论是否在application.ini中指定了ap.library.namespace或者通过Yaf_Loader::registerLocalNamespace()注册本地的命名空间前缀,那么在程序中遇到未定义的类的时候,会自动到ap.directory.library中寻找对应的类。(ap.directory.library是Yaf必不可少的配置,该配置指定了项目的绝对路径地址)
- 如果在产品的application.ini文件中指定了本地的ap.library,但是却没有通过ap.library.namespace或者Yaf_Loader::registerLocalNamespace()指定本地的命名空间,那么无论是都指定了yaf.library,都会去yaf.library中加载类;
- 只有在指定了本地类的ap.library,指定了本地的命名空间且类名中包含有命名空间的前缀的时候,才回去本地的类库中加载对应的类;否则到yaf.library中指定的文件中加载对应的类。指定命名空间的方式为:
$loader = Yaf_Loader::getIgnstance(); $loader->registerLocalNamespace(array("local"));
或者在项目中的conf/application.ini中指定ap.library.namespace为local确定本地的命名空间。
下面以类名local_sublocal_test.php说明上面三种情况分别对应的加载规则。
- 这种情况下,ap.directory一般在application.ini指定为APP_PATH(APP_PATH在入口文件index.php中定义),此时的加载路径为APP_PATH/library/local/sublocal/test.php;
- 这种情况下加载路径一般是yaf.library+'/local/sublocal/test.php';
- 这种情况下加载路径为ap.library+'/local/sublocal/test.php';
二、与MVC框架相关的类的自动加载
与MVC框架相关的类的的自动加载是通过使用特定的前缀或者后缀名确定类的加载路径的,通过类与其所在的文件的特定映射完成类的自动加载:类名=文件名+后缀。
对于控制器 Controller 默认模块下为{项目路径}/controllers/, 否则为{项目路径}/modules/{模块名}/controllers。例如,IndexController,该类自动加载文件 {项目目录}/Controllers/Index.php。
对于Model 加载路径为{项目目录}/models/, 类似比如UserModel则自动加载{项目目录}/models/User.php。
对于和V相关的视图文件不属于本文的讨论范围。
总结:本文是对Yaf中类的自动加载规则的总结,由于目前使用到的最多的就是和MVC相关的类的加载和在conf/application.ini中指定加载路径的类,因此只讨论这两种情况。其他的在项目路径中加载别的类的方式,在以后用到之后再和大家一起讨论。
Yaf框架下类的自动加载的更多相关文章
- YII框架的类自动加载机制
YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...
- 010.CI4框架CodeIgniter, autoload自动加载自己的helper函数类
01.自己定义了一个helper类,里面有个函数用来输出 02.定义一个Controller基本类,我们以后用到的Controllers类都继承自这个类.其中自动加载helper函数如图所示: 03. ...
- ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询
ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...
- 框架技术--Spring自动加载配置
今天项目中遇到一个问题,一个方法在服务启动后会自动被执行,查看了下配置未发现有定时的配置.但是后来发现是spring配置了启动时默认加载了方法. 代码: <?xml version=" ...
- PHP中类自动加载的方式
最近在学习composer,发现从接触PHP到现在已经遇到了三种关于PHP中类的自动加载方式,这其中包括PHP自带的类的自动加载方式.PHP的第三方的依赖管理工具composer的加载方式以及PHP的 ...
- Yii2的深入学习--自动加载机制
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- Yii2的深入学习--自动加载机制(转)
Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个 ...
- PHP 命名空间以及自动加载(自动调用的函数,来include文件)
这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...
- 阻止YII 1.0自动加载内置JQUERY库
有些时候我们会在项目中用到很多js库, 因为Yii 1.0框架会默认自动加载一些自带核心库, 很容易引起冲突问题, 下面的代码就展示了如何在Yii 1.0框架下取消jQuery自动加载. Open C ...
随机推荐
- js中二维数组的初始化
在编程过程中,很多情况下(涉及到坐标.层级操作)我们都会用到二维数组,下面介绍介绍几种二维数组初始化的方法: 方法一.直接定义并且初始化,这种情况适用于数量和值已知的数组: var arr=[[&qu ...
- window安装jekyll
安装Ruby Ruby 切记添加环境变量: 安装 RubyGems RubyGems 解压后进入目录输入: ruby setup.rb 安装Jekyll gem install jekyll 安装je ...
- Linux LVM硬盘管理之二:创建逻辑卷步骤
创建逻辑卷(LV)的顺序:Linux分区---物理卷(PV)---卷组(VG)---逻辑卷(LV)---挂载到文件系统 删除逻辑卷(LV)的顺序:卸载文件系统----逻辑卷(LV)---卷组(VG)- ...
- Ionic开发实战
转自:http://blog.csdn.net/i348018533/article/details/47258449/ 折磨的两个月!Ionic从零单排,到项目发布!遇到了很多问题但都一一解决了,此 ...
- MVC学习笔记-01
什么是MVC MVC是指(Model-View-Controll即模型-视图-控制器)用于表示表示一种软件架构模式,它把软件分成三个基本的部分:模型(Model),视图(view),控制器(Contr ...
- [2014.01.27]wfPrintOcx 票据打印控件 v5.3
支持选择打印机,并自动记忆选择的打印机. 适合打印各类票据格式. 支持画正方形.长方形.圆形.椭圆.横线.竖线.HTTP图片. 支持数字金额转换成中文大写金额. 可以设置固定宽度的文字自动换行. 组件 ...
- TextBlock
一.TextBlock与Lable TextBlock是比Lable更底层的控件如果用TextBlock可以完成的需求就尽量不用Lable可以稍微提升一点性能. 参考文档 二.TextBlock内容过 ...
- 用两个Stack来实现一个Queue
import java.util.Stack; /** * 问题:用两个Stack来实现一个Queue; * 方法:栈的特点是先进后出:而队列的特点是先进先出: * 用两个栈正好能把顺序调过来: * ...
- ruby生成随机成绩
生成16个86到99范围内的值,并且每个成绩打印一行,这样就可以复制粘贴到Excel中! 16.times {|x| puts (86..99).to_a.sample}
- ngCordova
参见:http://blog.csdn.net/Luo_xinran/article/details/52164480 ngCordova是基于Cordova封装的AngularJS的调用本地设备接口 ...