前面两篇博客分别讲述了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规则进行加载的时候,类名中的"_"都会被转换成目录分隔符“/”。

  根据所看过的博客,全局类和本地类的加载规则可总结如下:

  1. 如果指定yaf.library和产品的application.ini中指定ap.library,那么无论是否在application.ini中指定了ap.library.namespace或者通过Yaf_Loader::registerLocalNamespace()注册本地的命名空间前缀,那么在程序中遇到未定义的类的时候,会自动到ap.directory.library中寻找对应的类。(ap.directory.library是Yaf必不可少的配置,该配置指定了项目的绝对路径地址)
  2. 如果在产品的application.ini文件中指定了本地的ap.library,但是却没有通过ap.library.namespace或者Yaf_Loader::registerLocalNamespace()指定本地的命名空间,那么无论是都指定了yaf.library,都会去yaf.library中加载类;
  3. 只有在指定了本地类的ap.library,指定了本地的命名空间且类名中包含有命名空间的前缀的时候,才回去本地的类库中加载对应的类;否则到yaf.library中指定的文件中加载对应的类。指定命名空间的方式为:
$loader = Yaf_Loader::getIgnstance();
$loader->registerLocalNamespace(array("local"));

  或者在项目中的conf/application.ini中指定ap.library.namespace为local确定本地的命名空间。

  下面以类名local_sublocal_test.php说明上面三种情况分别对应的加载规则。

  1. 这种情况下,ap.directory一般在application.ini指定为APP_PATH(APP_PATH在入口文件index.php中定义),此时的加载路径为APP_PATH/library/local/sublocal/test.php;
  2. 这种情况下加载路径一般是yaf.library+'/local/sublocal/test.php';
  3. 这种情况下加载路径为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框架下类的自动加载的更多相关文章

  1. YII框架的类自动加载机制

    YII之所以能实现快速的自动加载类文件,是因为它通过两种途径来实现. 先看文件 vendor\yiisoft\yii2\BaseYii.php 里面的 autoload 方法 public stati ...

  2. 010.CI4框架CodeIgniter, autoload自动加载自己的helper函数类

    01.自己定义了一个helper类,里面有个函数用来输出 02.定义一个Controller基本类,我们以后用到的Controllers类都继承自这个类.其中自动加载helper函数如图所示: 03. ...

  3. ASP.NET MVC搭建项目后台UI框架—11、自动加载下拉框查询

    ASP.NET MVC搭建项目后台UI框架—1.后台主框架 需求:在查询记录的时候,输入第一个字,就自动把以这个字开头的相关记录查找出来,输入2个字就过滤以这两个子开头的记录,依次类推. 突然要用到这 ...

  4. 框架技术--Spring自动加载配置

    今天项目中遇到一个问题,一个方法在服务启动后会自动被执行,查看了下配置未发现有定时的配置.但是后来发现是spring配置了启动时默认加载了方法. 代码: <?xml version=" ...

  5. PHP中类自动加载的方式

    最近在学习composer,发现从接触PHP到现在已经遇到了三种关于PHP中类的自动加载方式,这其中包括PHP自带的类的自动加载方式.PHP的第三方的依赖管理工具composer的加载方式以及PHP的 ...

  6. Yii2的深入学习--自动加载机制

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  7. Yii2的深入学习--自动加载机制(转)

    Yii2 的自动加载分两部分,一部分是 Composer 的自动加载机制,另一部分是 Yii2 框架自身的自动加载机制. Composer自动加载 对于库的自动加载信息,Composer 生成了一个  ...

  8. PHP 命名空间以及自动加载(自动调用的函数,来include文件)

    这篇文章的目的是记录 1. php中的自动加载函数 __autoload(), 和 spl_autoload_register()函数, 2 .php中命名空间的使用. 一.当不使用命名空间的时候 a ...

  9. 阻止YII 1.0自动加载内置JQUERY库

    有些时候我们会在项目中用到很多js库, 因为Yii 1.0框架会默认自动加载一些自带核心库, 很容易引起冲突问题, 下面的代码就展示了如何在Yii 1.0框架下取消jQuery自动加载. Open C ...

随机推荐

  1. IntelliJ IDEA 在网页修改数据,但是在浏览器刷新的时候,不能读取到修改之后的数据

    使用IntelliJ IDEA 在网页修改数据,但是在浏览器刷新的时候,不能读取到修改之后的数据? 解决办法:tomcat配置中,On frame deactivation属性选择Update cla ...

  2. oracle数据库备份和还原

    ip导出方式:exp  demo/demo@127.0.0.1:1521/orcl file=f:\f.dmp full=y 备份:exp demo/demo@orcl file=f:\f.dmp f ...

  3. asp.net 各种路径

    Request.Path 是包含文件名的,而 Request.ApplicationPath 是应用程序路径,不包含文件名. 示例: Request.Path = /cftea/Default.asp ...

  4. CentOS 6 到 CentOS 7

    redhat提供了一个redhat-upgrade-tool的升级工具: [1]配置软件源   # vim /etc/yum.repos.d/upgrade.repo [upgrade] name=u ...

  5. Ubuntu 16.04 安装ftp服务器传输文件

    最近在搞深度学习,老师比较宝贝他的服务器,要求我以后负责管理服务器.往后所有要使用服务器的人都必须向我申请账号,然后只允许客户端访问,使用文件传输软件传输文件.像我这样一个linux菜逼,这种要求不是 ...

  6. Oracle基本教程

    Oracle基本教程 1.Oracle介绍 2.SqlPlus使用 3.用户管理与权限控制 4.数据库备份与还原 5.物理备份--Rman 6.常用查询 7.Oracle用法集锦 8.oracle修改 ...

  7. [转载]jQuery1.9完全删除live事件

    其实关于live被删除的事件早就在1.7.2版本以后就有通知过了 不过在官方一直提倡使用.on代替.live的过程中 .live事件一直沿用 今天更新了 看下jQuery1.9的相关信息 发现api中 ...

  8. 01从c到c++

    c++的发展历史  + 80年代贝尔实验室 本贾尼 + 83年 正式命名c++ + 87年 gnu制定了c++标准 + 92年 微软和IBM分别制定了c++标准 + 98年 ansi ISO 制定了标 ...

  9. jQuery源码:从原理到实战

    jQuery源码:从原理到实战 jQuery选择器对象 $(".my-class"); document.querySelectorAll*".my-class" ...

  10. 数据库schema设计与优化

    原文地址 1. 前言 对于数据库而言,在日常开发中我们主要的关注点有两块,一个是schema的结构设计,另一个就是索引的优化,这两块是影响我们最终系统结构和性能的关键部分,自然也是我们花费精力最多的部 ...