php autoload用法,php自动加载__autoload()函数用法

autoload在php主版本中是自动加载文件的一个方法了我们可以定义许多的文件在目录然后通过autoload加载了,下面来看看autoload函数用法。

在PHP5之后,我们可以通过 __autoload来解决这个问题。 而且在PHP5.1之后,还提供了 spl_autoload_register() 来提供更完善的加载机制。

通过阅读了 Autoloading in PHP 这篇文章,我理解的 Autoload 的加载机制,当通过 new 来实例化一个类时,PHP会通过定义的__autoload 函数加载相应的文件,如果这个类文件使用了 extends 或者 implements 需要用到其他的类文件,php会重新运行 autoload 去进行类文件的查找和加载,如果发生了两次对同一类文件的请求,就会报错

自动加载原理

在使用PHP的OO模式开发系统时,通常大家习惯上将每个类的实现都存放在一个单独的文件里,这样会很容易实现对类进行复用,同时将来维护时也很便利。这也是OO设计的基本思想之一。在PHP5之前,如果需要使用一个类,只需要直接使用include/require将其包含进来即可。下面是一个实际的例子:

/* Person.class.php */

class Person {

var $name, $age;

function __construct ($name, $age)

{

$this->name = $name;

$this->age = $age;

}

}

?>

/* no_autoload.php */

require_once (”Person.class.php”);

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

在这个例子中,no-autoload.php文件需要使用Person类,它使用了require_once将其包含,然后就可以直接使用Person类来实例化一个对象。

但随着项目规模的不断扩大,使用这种方式会带来一些隐含的问题:如果一个PHP文件需要使用很多其它类,那么就需要很多的require/include语句,这样有可能会造成遗漏或者包含进不必要的类文件。如果大量的文件都需要使用其它的类,那么要保证每个文件都包含正确的类文件肯定是一个噩梦。

PHP5为这个问题提供了一个解决方案,这就是类的自动装载(autoload)机制。autoload机制可以使得PHP程序有可能在使用类时才自动包含类文件,而不是一开始就将所有的类文件include进来,这种机制也称为lazy loading。

下面是使用autoload机制加载Person类的例子:

/* autoload.php */

function __autoload($classname) {

require_once ($classname . “class.php”);

}

$person = new Person(”Altair”, 6);

var_dump ($person);

?>

通常PHP5在使用一个类时,如果发现这个类没有加载,就会自动运行__autoload()函数,在这个函数中我们可以加载需要使用的类。在我们这个简单的例子中,我们直接将类名加上扩展名”.class.php”构成了类文件名,然后使用require_once将其加载。从这个例子中,我们可以看出autoload至少要做三件事情,第一件事是根据类名确定类文件名,第二件事是确定类文件所在的磁盘路径(在我们的例子是最简单的情况,类与调用它们的PHP程序文件在同一个文件夹下),第三件事是将类从磁盘文件中加载到系统中。第三步最简单,只需要使用include/require即可。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。

因此,当有大量的类文件要包含的时候,我们只要确定相应的规则,然后在__autoload()函数中,将类名与实际的磁盘文件对应起来,就可以实现lazy loading的效果。从这里我们也可以看出__autoload()函数的实现中最重要的是类名与实际的磁盘文件映射规则的实现。

但现在问题来了,如果在一个系统的实现中,如果需要使用很多其它的类库,这些类库可能是由不同的开发人员编写的,其类名与实际的磁盘文件的映射规则不尽相同。这时如果要实现类库文件的自动加载,就必须在__autoload()函数中将所有的映射规则全部实现,这样的话__autoload()函数有可能会非常复杂,甚至无法实现。最后可能会导致__autoload()函数十分臃肿,这时即便能够实现,也会给将来的维护和系统效率带来很大的负面影响。在这种情况下,难道就没有更简单清晰的解决办法了吧?答案当然是:NO! 在看进一步的解决方法之前,我们先来看一下PHP中的autoload机制是如何实现的。

(2) PHP的autoload机制的实现

实现自动加载,我们需要借助一个函数来实现:

/*

autoload_function

欲注册的自动装载函数。如果没有提供任何参数,则自动注册 autoload 的默认实现函数spl_autoload()。

throw

此参数设置了 autoload_function 无法成功注册时, spl_autoload_register()是否抛出异常。

prepend

如果是 true,spl_autoload_register() 会添加函数到队列之首,而不是队列尾部。

*/

bool spl_autoload_register ([ callable $autoload_function [, bool $throw = true [, bool $prepend = false ]]] )

最常用的一种方式就是通过spl_autoload_register函数来注册自动加载类的方法!

通过spl_autoload_register注册

我们可以通过spl_autoload_register函数注册类的方法,在类调用前,我们判断类文件路径是否是文件,如果是则引入之!

下面是一个小例子:

class autoload

{

publicstatic functionload($className)

{

$name = str_replace('\\', '/', $className);

$fileName = sprintf('%s.php', $name);

if (is_file($fileName)) {

require_once $fileName;

}

// var_dump($fileName);

}

}

// 这样写也可以的

// spl_autoload_register(array("autoload", "load"));

spl_autoload_register("autoload::load");

通过__autoload函数实现

我们新建一个autoload.php文件,里面只放如下代码也可以实现上面一样的功能:

function__autoload($className) {

$name = str_replace('\\', '/', $className);

$fileName = sprintf('%s.php', $name);

if (is_file($fileName)) {

require_once($fileName);

}

}

小结

自动加载可以使得我们的操作更简便,经常需要自动加载一些默认配置,因此掌握自动加载的实现是非常重要的!

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

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

相关文章

jaxb xsd生成xml_使用JAXB从XSD生成XML

jaxb xsd生成xml这是最初由JCG合作伙伴 Experiences Unlimited的Mohamed Sanaulla发表的帖子。 Mohamed解释了如何使用JAXB从给定的XSD生成XML 。 (注意:对原始帖子进行了少量编辑以提高可读性) 我们可以使用JAXB使用给定的Schema将Java对象…

oracle 10g客户端连接11g,生产环境oracle10g升级至11g准备工作

主要有以下的步骤 :1.new ORACLE_HOME(11g), old ORACLE_HOME (10g)--这些需要提前提供给客户,作为基本的约定2.install oracle software 11.2.0.2.0 on production--总共有7个DB,时间很紧,所以准备要充分3.apply DB patch additional if nee…

JBoss BPM Travel Agency的微服务迁移故事

不久前,我们启动了一个规模较大的JBoss Travel Agency演示项目,以展示JBoss BPM Suite的一些更有趣的功能。 我们提供了一系列视频 ,不仅向您展示了如何安装它,项目中各种规则和流程工件的含义,还向您介绍了在实际使…

windows快捷操作

命令行启动或关闭VMWare服务: net start VMwareHostdVMAuthdServiceVMUSBArbService"VMware NAT Service"VMnetDHCP#启动VMware虚拟机服务net start VMwareHostdnet start "VMware NAT Service"net start VMnetDHCPcmd#停止VMvare虚拟机服务net…

oracle 打印值,oracle – 在SQL Developer中打印变量的值

我想打印一个特定变量的值在一个匿名块内。我使用Oracle SQL Developer。我尝试使用dbms_output.put_line。但它不工作。我使用的代码如下所示。SET SERVEROUTPUT ONDECLARECTABLE USER_OBJECTS.OBJECT_NAME%TYPE;CCOLUMN ALL_TAB_COLS.COLUMN_NAME%TYPE;V_ALL_COLS VARCHAR2(5…

【leetcode】Combinations (middle)

Given two integers n and k, return all possible combinations of k numbers out of 1 ... n. For example,If n 4 and k 2, a solution is: [[2,4],[3,4],[2,3],[1,2],[1,3],[1,4], ] 思路:有点像0-1背包问题, 对于从1-n的每一个数字都可以选择放入…

oracle 批量读,Oracle批量读取数据和批量绑定

通常我们获取游标数据是用fetch some_cursor into var1, var2 的形式,自 Oracle 8i 起,Oracle 为我们提供了fetch bulkcollect 来批量取游标中的数据,它能在读取游标中大量数据的时候提升效率,采用bulkcollect可以将查询结果一次性…

java压缩_Java压缩

java压缩在最近的项目中,我们不得不做一些我个人从未真正看过的事情。 压缩。 我们需要拍摄几个文件和图像,将它们压缩并提供给FTP使用,是的,总有一天,感觉确实回到了90年代。 除了过去的FTP之行外,它还是一…

我们的世界

看完记得留言说说你的感想 http://lchml.com/our-world/ 转载于:https://www.cnblogs.com/licheng127/p/4239021.html

eslint php,ESlint操作步骤详解

这次给大家带来ESlint操作步骤详解,ESlint操作的注意事项有哪些,下面就是实战案例,一起来看一下。vue-cli脚手架创建的项目默认使用ESlint规则,启动项目的时候因为各种语法报错,不得不先停下了解一下什么是ESlint&…

FileSystemMap:与文件系统交互的自然方法

作为项目的一部分,我目前正在研究创建FileSystemMap 。 我已经开始了一个非常小的GitHub的项目在这里举办的代码。 本质上,此映射实现将允许用户与其文件系统上的目录进行交互,就好像它是java.util.Map 。 映射中的每个条目将是该目录中的文…

动画原理——绘制正弦函数环绕运动椭圆运动

书籍名称&#xff1a;HTML5-Animation-with-JavaScript 书籍源码&#xff1a;https://github.com/lamberta/html5-animation 1.正弦函数。x位置递增&#xff0c;y位置用sin生成。 这段代码是不需要ball.js的。 代码如下&#xff1a; <!doctype html> <html><hea…

oracle优质图书,经典Oracle图书推荐(之四)_oracle

经典的oracle图书:Oracle High Performance Tuning for 9i and 10g by Gavin PowellBook DescriptionThere are three parts to tuning an Oracle database: data modeling, SQL code tuning and physical database configuration.A data model contains tables and relationsh…

expr命令 linux,Shell expr命令进行整数计算的实现

expr 是 evaluate expressions 的缩写&#xff0c;译为“表达式求值”。Shell expr 是一个功能强大&#xff0c;并且比较复杂的命令&#xff0c;它除了可以实现整数计算&#xff0c;还可以结合一些选项对字符串进行处理&#xff0c;例如计算字符串长度、字符串比较、字符串匹配…

单身数字_完美单身

单身数字我不时遇到一些Java程序员&#xff0c;他们不确定他们应该如何正确实现Singleton模式。 &#xff08;如果您不知道什么是Singleton&#xff0c;请尝试Wikipedia&#xff1a; Singleton模式 &#xff09;。 我并不是在谈论在线程环境中的正确实现。 但是&#xff0c;使用…

linux下bios设置内存电压,系统安装的BIOS设置?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼要安装系统前&#xff0c; 要为旧系统做好备份工作&#xff0c;为新系统准备了所需的软件之后&#xff0c;接下来的工作就是安装Windows XP了。而安装系统要知道系统安装的BIOS设置&#xff0c; 如果您的硬盘采用了动态分区&#x…

DATEADD(Day, DATEDIFF(Day,0,ShippingTime), 0)

select DATEADD(Day, DATEDIFF(Day,0,GETDATE()), 0),DATEDIFF(Day,0,GETDATE()),GETDATE() 结果&#xff1a; (无列名) (无列名) (无列名)2015-01-30 00:00:00.000 42032 2015-01-30 20:04:57.050 转载于:https://www.cnblogs.com/Unrmk-LingXing/p/4263098.html

linux内存剩余量为什么这么少,为什么我的Linux系统中空闲内存如此之少?

"How come there is only so few free memory on my Linux PC?"Come to same question? No matter how much you put RAM in your motherboard, you quickly notice the free RAM is reduced so fast. Free RAM miscalculation? No!Before answering this, first …

java heroku_Heroku运行Java

java heroku如果您是像我这样的Java迷&#xff0c;那么您有个好消息值得振奋。 Heroku现在运行Java&#xff01; 嗯&#xff0c;与其他流行的“ Web”语言&#xff08;如PHP / RoR&#xff09;不同&#xff0c;Java具有在Web服务器中进行部署和维护的麻烦。 一直以来&#xff0…

Java集合框架练习-计算表达式的值

最近在看《算法》这本书&#xff0c;正好看到一个计算表达式的问题&#xff0c;于是就打算写一下&#xff0c;也正好熟悉一下Java集合框架的使用&#xff0c;大致测试了一下&#xff0c;没啥问题。 import java.util.*; /** * 用来计算表达式* for example: 12*3*(43*1)-3*123/…