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 ...
随机推荐
- 【耐克】【Air Max90 气垫跑鞋】
[max90 36-44] [加毛冬款 36-44] [黑白百搭款 36-44] [air max90 高帮 冬款 耐看百搭 36-44] [air max90 高帮 40-44] [Air Max9 ...
- SQL系统数据库简介(mssqlsystemresource)
mssqlsystemresource
- php://input
从官网信息来看,php://input是一个只读信息流,当请求方式是post的,并且enctype不等于"multipart/form-data"时,可以使用php://input ...
- 配置文件的生成,关于“make menuconfig”
之前学习嵌入式的时候从来没有注意过内核源文件下配置文件的生成(都是跟着老师的步骤直接复制过来修改成.config),其实意思也差不多,只是我没有细想其所以然: 编译内核的过程中,配置文件生成过程,A. ...
- exiv2 如何改变时间戳
有很多c/c++库可以实现jpeg的exif信息的读取,比如libexif或者CxImage等.但如果我们对jpeg进行有关处理后,想在写入文件时保留原有的exif信息(比如拍摄时间等)就有点棘手了. ...
- Excel 读取字符串引发的问题
将EXCEL数据导出的时候如果同一列数据中既有文字,又有数字!读取时一列中要么文字丢失只剩下数字,要么数字丢失,只剩下文字,这是由第一行的数据类型决定的.出现这种问题是由于数据类型不统一造成的. 连接 ...
- HoloLens外包团队:HoloLens有一个严重缺陷,但微软并不想改
微软的HoloLens自公布以来,几乎获得了一边倒的赞美声.它使用了增强现实(AR)技术,在现实世界中叠加一层虚拟影像,能让人仿佛置身魔法世界.但从最新的Hololens硬件体验上看,它可能有一个致使 ...
- [wxWidgets] 2. 重访“Hello World” 程序
这是四年多来在博客园的第二篇博客.有了上一次的排版使用经验,这一篇文章应该有些进步(^_^). 闲话按下不表,言归正传.在编译.成功运行了上一个helloWorld.cpp(后文中'hw'简称hell ...
- AVD Manager
启动AVD Manager会弹出下面的窗口: 然后点击右侧的Create来新建一个模拟器,创建一个模拟器,取名Phone,然后选择设备屏幕尺寸,SDK的大小. 创建完成后,选中刚刚创建的模拟器,然后点 ...
- MVC4中 访问webservice 出现无法找到资源的错误
出现这个情况,是mvc将webservice.asmx解析成了控制器,下面先将这个控制器忽略 继续访问出现这样的错误: 下面修改配置文件 访问成功