php的类装载的步骤,设计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 函数。

define(CLASSPATH, dirname(__FILE__).'/entity'.':'.dirname(__FILE__).'/meta');function __autoload($classname) {

$filename = strtolower(preg_replace('/(?<=/B)([A-Z])/s', '_$1', $classname)) . ".class.php";

foreach (preg_split('/:/',CLASSPATH) as $cp) {

if (file_exists("$cp/$filename")) {

require_once ("$cp/$filename");

break;

}

}

}

四、启用自动类装载功能

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

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

501e70f9505b3b440080bc4e17c4785e.png

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

question_parser.php -> question_sysext.php

||

//

meta* => entity*

五、扩展思考

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/260173.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python 重定向 ctf_3.CTF——python利用工具

web AWD 攻与防CTF线下赛主要考察代码审计能力及运维能力&#xff0c;代码审计发现漏洞&#xff0c;python写利用漏洞&#xff0c;运维发现可疑攻击目标&#xff0c;异常流量&#xff0c;异常权限&#xff0c;重要业务备份与还原。用运维的知识加固系统与业务。当被人攻击以后&…

网站首页幻灯片

Js页面: View Code /** * 大眼睛广告轮播 */ var indexEye {autoTime: 0,init: function () {var eyeObj $("#dyj_pics a:eq(0) img:eq(0)");eyeObj.attr("src", eyeObj.attr("data-imgSrc"));eyeObj.load(function () {indexEye.autoTime se…

【java】错误 找不到或无法加载主类

很诡异&#xff0c;class文件夹下的class文件没有了&#xff0c;删除文件夹 &#xff0c;重新编译下。。。转载于:https://www.cnblogs.com/merlini/p/3892719.html

Qt之QAbstractItemView视图项拖拽(二)

一、需求说明 上一篇文章Qt之QAbstractItemView视图项拖拽(一)讲述了实现QAbstractItemView视图项拖拽的一种方式&#xff0c;是基于QDrag实现的&#xff0c;这个类是qt自己封装好了的&#xff0c;所以可定制性也就没有了那么强&#xff0c;最明显的是&#xff0c;这个类在执…

电脑控制苹果手机_必备神器,电脑控制手机

序一款电脑端的神器&#xff0c;它可以任意的操纵你的手机。****QtScrcpy可以通过USB(或通过TCP/IP)连接Android设备&#xff0c;并进行显示和控制。不需要root权限。单个应用程序最多支持16个安卓设备同时连接。同时支持GNU/Linux&#xff0c;Windows和MacOS三大主流桌面平台。…

php未定义要怎样做,php-Behat-未定义的功能步骤

我设置了一个简单的测试场景来学习behat,但是我遇到了一些问题.我正在关注THIS教程.这是我的专题节目&#xff1a;Feature: showThis is a behat feature to test the article pages.##TODOScenario: I want to view a detailed article pageGiven I am logged inAnd Im on &qu…

CentOS 命令大全 (转)

1、查看系统使用端口并释放端口 [rootmy_nn_01 WEB-INF]# lsof -w -n -i tcp:80 COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME java 24065 root 34u IPv6 269149 TCP *:http (LISTEN) [rootmy_nn_01 WEB-INF]# kill -9 24065 2、以KB/MB形式显示文件列表…

微信接口改良

之前公司微信开发的时候 写了个微信的接口改良版,当然好多想改进的都没改。。大概是太懒了 &#xff08;囧 /*** Created by DFH on 13-12-16.*//*--htmlvar shareData {//分享展示图片地址 **必须"imgUrl": "a.jpg",//分享至朋友圈链接 **必须&q…

生活大爆炸版石头剪刀布

题目描述 Description石头剪刀布是常见的猜拳游戏&#xff1a;石头胜剪刀&#xff0c;剪刀胜布&#xff0c;布胜石头。如果两个人出拳一样&#xff0c;则不分胜负。在《生活大爆炸》第二季第8集中出现了一种石头剪刀布的升级版游戏。升级版游戏在传统的石头剪刀布游戏的基础上&…

oracle18c卸载方法,在debian 10上安装和卸载oracle数据库快捷版18c第4版

安装oracle-xe-18c的步骤此安装向导依赖软件包alien。由于oracle并未提供oracle-xe-18c的deb包&#xff0c;故需要通过alien命令将oracle-xe-18c的rpm格式的安装包导出新的deb格式的安装包&#xff1a;sudo alien --scripts -d oracle-database-xe-18c-1.0-1.x86_64.rpm相应rpm…

解决:缺少aclocal、autoconf、automake

下载三个包&#xff1a;autoconf-2.68.tar.bz2、automake-1.11.1.tar.bz2、m4-1.4.14.tar.bz2 1、su - root 2、tar xjf XXXXX.tar.bz2 3、cd m4/ 4、./configure make make install 5、cd autoconf/ 6、./configure make make install 7、cd automake/ 8、./configure…

jquery事件 on(),live(),delegate(),blind()

jQuery推出on()的目的有2个&#xff0c;一是为了统一接口&#xff0c;二是为了提高性能&#xff0c; 所以从现在开始用on()替换bind(), live(), delegate吧。 尤其是不要再用live()了&#xff0c;因为它已经处于不推荐使用列表了[1.7已经被删除]。 如果只绑定一次事件&#xff…

Swift 开发的工具类,主要是提供正则表达式及其它,Github会长期维护

直接访问 GitHub 看代码 YYGRegular 我是&#xff1a; 语歌复制代码It is a regular expression used on iOS, which implement by Swift 这是一个基于swift快捷开发的扩展类&#xff0c;目前的涵盖内容包括详细打印&#xff0c;正则表达式&#xff0c;会经常维护 介于是增加更…

用python庆祝生日_生日到底该过阴历还是阳历好呢?不是迷信,都怪我们大意!...

过生日到底该过阴历还是阳历&#xff1f;答案说出来你可能都不信在我们国家&#xff0c;过生日有两种不同的方式&#xff0c;因为有两种不同的日子的计算方式&#xff0c;分为阴历和阳历。一般来说&#xff0c;在农村和一些比较落后的地方&#xff0c;人们习惯于用阴历来计算生…

websphere jndi oracle,websphere7.0获得JNDI连接报invalid username/password

Exception in thread "P497968:O0:CT" java.sql.SQLException: ORA-01017: invalid username/password; logon deniedDSRA0010E: SQL 状态&#xff1a;72000&#xff0c;错误码&#xff1a;1,017at oracle.jdbc.driver.SQLStateMapping.newSQLException(SQLStateMapp…

WSS3.0自带数据库可以使用SQL 2005 Server Management Studio来管理

默认情况下&#xff0c;安装完WSS3.0后&#xff0c;会自动安装一个自带的SQL Server 2005 Embedded Edition数据库&#xff0c;但是此数据库却没有管理工具,不像安装SQL 2005其它版本会有管理工具。如果你要管理数据库&#xff0c;这时怎么办呢。经过俺试了一上午了&#xff0c…

CPU的高速缓存存储器知识整理

基于缓存的存储器层次结构 基于缓存的存储器层次结构行之有效&#xff0c;是因为较慢的存储设备比较快的存储设备更便宜&#xff0c;还因为程序往往展示局部性&#xff1a; 时间局部性&#xff1a;被引用过一次的存储器的位置很可能在不远的将来被再次引用。 空间局部性&#x…

uniapp光标自动定义到文本框_word技巧自动生成毕业论文目录

一篇word文档&#xff0c;内容有大的章&#xff0c;小的节。如何把章节抽出来生成目录&#xff1f;WORD →点击需要插入的地方 → 插入菜单 → 索引和目录 → 目录 → 确定。1 创建标题目录Word 一般是利用标题或者大纲级别来创建目录的。因此&#xff0c;在创建目录之前&#…

JSTL

2019独角兽企业重金招聘Python工程师标准>>> 说明 JSTL 是 JAVA 中的一个定制标记库集。实现了JSP页面中代码的复用&#xff0c;增加了JSP页面的可读性&#xff0c;方便查看和参与开发 使用 1.下载地址 http://archive.apache.org/dist/jakarta/taglibs/standard/bi…

[jQuery] event.stopPropagation()报错

使用jQuery给一个事件加处理方法时&#xff0c;为了阻止一个事件向上冒泡&#xff0c;使用了event.stopPropagation()&#xff0c;但在IE下却报对象不支持此属性或方法的错误&#xff08;IE下是event. cancelBubbletrue&#xff09;&#xff0c;jQuery不是兼容各浏览器吗&#…