`
javasogo
  • 浏览: 1815970 次
  • 性别: Icon_minigender_1
  • 来自: 北京
文章分类
社区版块
存档分类
最新评论

设计PHP自动类装载功能

 
阅读更多

在使用面向对象方法做PHP开发时,可能会经常使用到各个路径中的类文件,这就需要大量的 include 或 require,而 PHP 提供了一个比较快捷的方式,就是利用函数 __autoload 可以编程实现动态的类装载功能,这样就不需要手动的编写大量include 或 require,好了,下面切入正题。

设计思路:如果想实现自动类装载功能,就必须使用 PHP 提供的 __autoload 函数,该函数只有一个参数,即我们在程序编写时所涉及到的类名称,当函数被调用时,我们要做的就是利用传入的类名加载这个类所在的文件。

第一个问题就是,我们如何得知类属于哪个文件名呢?在做 Java 或 .Net 程序时,整个运行的程序会根据类名在内存中查找对应的类型信息(常常会伴随着命名空间作为限定),内存的类型信息来自于应用程序初始化时的类文件装载,这点与 PHP 是有区别的,PHP 程序不会装载所有内容,它只是在代码运行到某处需要装载必要的文件时才会发出装载请求。暂时抛弃何时装载这个问题,再次回到装载类文件,不管是 .Net 还是 Java,它们在装载类型信息的时候,都是类名查找类型信息的,从这点看来 __autoload 采用的也是相同的方法,但是 PHP 在定义类时并不要求文件名与类名保持一致,这就有可能造成文件与类杂乱无章,给类装载实现带来麻烦,所以有必要人为的规定类定义与其所在的文件需要采用相同的名称,或者两者之间按照某种规则可以互相映射,这样就很容易。

第二个问题,类所在的文件名已经可以确定,但是这个文件是属于哪个目录呢?Java 可以根据包名来进行查找,.Net 有命名空间,虽然新版本的 PHP 引入了命名空间的概念,但是既存的服务器也许会因为多种原因不能为每个客户提供最新的环境,所以还是得从 PHP 本身下手比较实用。虽然没有命名空间,但是可以借鉴操作系统的环境变量概念,将不同的路径名放入环境变量中,这样就可以从环境变量中读取各个目录,然后找到目标类所在的文件。

一、类名与文件名映射

这一步要做的就是定义文件名与类名映射规则,类名采用驼峰命名法,即类名的每个单词首字母需大写,而文件的命名则采用全部单词小写,单词之间以下划线分割,后缀名为 .class.php 。

二、在环境变量中进行路径遍历

仿照 UNIX 或 Windows 的环境变量的定义方式,将多个文件夹以分号或冒号分隔,罗列在 CLASSPATH 中。当程序读取时,可以将文件夹路径放入数组中。

三、开始装载

调用函数 require 或 include 并利用组合好的文件路径进行文件装载,但是有两处需要注意,首先需要判断组合好的路径是否有效,其次,文件成功装载后,为了效率问题,可以马上退出 __autoload 函数。

四、启用自动类装载功能

主动式:将该函数直接或间接包含在当前文件中,之后无论在文件何处编写代码,类文件都可以自动装载。

被动式:将该函数直接或间接包含在当前文件中,以当前文件为主控制程序,然后调用其它业务实现,这样在其他业务实现文件中就无需考虑类装载的问题了。

在图中采用的是主动式,question_parser.php 通过创建 meta 中存放的类,这些类又调用 entity 中的内容,这个过程仅仅在 question_parser.php 包含了定义 __autoload 的 question_sysext.php,关系图如下:

question_parser.php -> question_sysext.php
 ||
 //
meta* => entity*

五、扩展思考

如果文件名与类名无任何关联性的话,可以装载 CLASSPATH 中定义的文件夹中所有 *.php 文件或是像例子那样装载 *.class.php 。

缓存类装载,当成功装载一个类所在的文件后,可以将类名与文件名记录下来以便下次使用,这样就无需每次都进行循环遍历,在某些情况下可以节省查找时间。

分享到:
评论

相关推荐

    PHP+TXT站点管理系统0.8版

    2、减少文件读取操作,采取小文件加判断调用,智能装载所需代码,提高网页反应速度。 3、更新smarty至3.0.8正式版,速度更快更稳定。 4、删除语言包文件,输出语言直接写入对应模板中,不再单列。 5、系统配置文件...

    易优cms模板工程机械铲土运输机械类网站模板.zip

    这类机械设备通常包括挖掘机、装载机、推土机等,广泛应用于建筑、矿山和基础设施建设等领域。最后,“.zip”表明这个模板是以压缩包的形式提供的,需要解压后才能在CMS系统中安装和使用。 【描述解析】 描述中的...

    CodeIgniter 用户指南 版本 2.1.4

    **自动装载** 功能可以预先加载类库、模型、辅助函数等资源,减少后续请求时的加载时间。 - **公共函数**:提供了多个公共函数,用于处理一些常见的任务,如检查 PHP 版本、检查文件是否可写等。 #### URI 路由 *...

    PHPEclipse

    这个插件提供了创建PHP工程,PHP 语法加亮,PHP代码自动补全、以及从帮助中呼出PHP文档等很实用的功能,还有一个值得一提的是,用PHP开发的一般是WEB网页,这个插件带了一个 PHPBrowser,当你保存PHP程序时,网页...

    PhalApi开源接口框架 v2.22.2.zip

    3. **依赖注入**:PhalApi采用依赖注入设计模式,允许开发者通过配置文件或自动装载来管理类的依赖关系,增强了代码的可测试性和可扩展性。 4. **错误处理与日志记录**:框架提供了一套完整的错误处理机制,可以...

    JAVA上百实例源码以及开源项目源代码

    Java日期选择控件完整源代码 14个目标文件 内容索引:JAVA源码,系统相关,日历,日期选择 Java语言开发的简洁实用的日期选择控件,源码文件功能说明: [DateChooser.java] Java 日期选择控件(主体类) [public] ...

    《货运物流车队管理系统》是一款适用于中小型货运车辆管理公司统计车辆费用.zip

    2. **运输任务调度**:结合人工智能算法,系统能够自动分配运输任务,考虑货物类型、目的地、车辆装载能力等因素,确保运输效率最大化。 3. **费用统计**:系统能够实时跟踪并记录每辆车的油耗、维修费、保险费、...

    Legato管理员指南7.4(中文)

    - **环境介绍**:EMC NetWorker 是一款功能强大的数据保护解决方案,专为满足企业级备份、恢复及灾难恢复需求而设计。此版本为7.4版,支持多种操作系统平台。 - **主要组件**:NetWorker 的核心组件包括服务器、...

    Symfony 高性能php框架 v4.4

    通过配置服务容器,开发者可以灵活地管理和控制类的依赖关系,实现服务的注册、自动装载和参数注入。 ### 四、路由系统 Symfony的路由系统是其强大功能的关键组成部分。它允许开发者定义URL模式,并将其映射到控制...

    一个物流公司网站管理源码

    1. **订单处理**:客户可以通过网站下单,系统应能自动接收、验证订单信息,并生成相应的物流单号。 2. **货物跟踪**:系统需具备实时更新货物状态的能力,让客户可以随时查看货物的位置和预计到达时间。 3. **...

    komatsu

    【标题】"komatsu"可能指的是日本的小松公司(Komatsu Ltd.),这是一家全球知名的重型机械制造商,尤其以生产挖掘机、装载机等工程机械而著名。不过,由于提供的信息有限,这里我们将假设"komatsu"与PHP编程语言...

    CoiTank-开源

    2. **自动装载(Auto-Wiring)**:CoiTank可以自动识别类之间的依赖关系,无需显式配置,简化了开发过程。 3. **AOP(面向切面编程)**:CoiTank支持类似于Spring的面向切面编程,开发者可以定义切面(Aspect)并将...

    transporte:运输

    理解变量、数据类型、控制结构、函数和类是PHP编程的基础。 2. **Web框架**:在开发运输系统时,通常会使用PHP的Web框架如Laravel、Symfony或CodeIgniter来加速开发过程并提高代码质量。这些框架提供了预定义的架构...

    Linux环境数据库管理员指南

    1.3.1 功能丰富 3 1.3.2 多任务 4 1.4 为什么选择 Linux 6 1.4.1 何时使用 Linux 6 1.4.2 服务器与工作站 6 1.4.3 推荐的硬件 7 1.4.4 移植到 Linux工作站 7 1.5 Linux分发包 8 1.6 升级或移植前的考虑 10 1.6.1 ...

    MySQL中文参考手册.chm

    10.9 设计选择 10.10 MySQL 设计局限/折衷 10.11 可移植性 10.12 我们已将MySQL用在何处? 11 MySQL 基准套件 12 MySQL 实用程序 12.1 各种 MySQL 程序概述 12.2 管理一个 ...

    MySQL中文参考手册

    + 4.15.3 自动启动和停止 MySQL + 4.15.4 选项文件 o 4.16 升级和降级(downgrading)时有什么特别要做的事情吗? + 4.16.1 从一个 3.22 版本升级到 3.23 + 4.16.2 从一个 3.21 版本升级到 3.22 + 4.16.3 从...

    MYSQL

    7.11 DELETE (删除)句法 7.12 SELECT (精选)句法 7.13 JOIN (联接)句法 7.14 INSERT (插入)句法 7.15 REPLACE (替换)句法 7.16 LOAD DATA INFILE (装载数据到文件)句法 7.17 UPDATE ...

Global site tag (gtag.js) - Google Analytics