加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 站长学院 > PHP教程 > 正文

PHP编程:php中spl_autoload详解

发布时间:2020-12-13 02:05:02 所属栏目:PHP教程 来源:网络整理
导读:《php中spl_autoload详解》要点: 本文介绍了php中spl_autoload详解,希望对您有用。如果有疑问,可以联系我们。 SPL有两个分歧的函数 spl_autoload,spl_autoload_call,通过将autoload_func指向这两个分歧的函数地址来实现分歧的自动加载机制. PHP实例 spl_a

《php中spl_autoload详解》要点:
本文介绍了php中spl_autoload详解,希望对您有用。如果有疑问,可以联系我们。

SPL有两个分歧的函数 spl_autoload,spl_autoload_call,通过将autoload_func指向这两个分歧的函数地址来实现分歧的自动加载机制.PHP实例

spl_autoload 是SPL实现的默认的自动加载函数,它的功能比拟简单.它可以接收两个参数,第一个参数是$class_name,表示类名,第二个参 数$file_extensions是可选的,表示类文件的扩展名" title="扩展名">扩展名,可以在$file_extensions中指定多个扩展名" title="扩展名">扩展名,护展名之间用分号隔开即 可;如果不指定的话,它将使用默认的扩展名" title="扩展名">扩展名.inc或.php.spl_autoload首先将$class_name变为小写,然后在所有的 include path中搜索$class_name.inc或$class_name.php文件(如果不指定$file_extensions参数的话),如果找 到,就加载该类文件.你可以手动使用spl_autoload(”Person”,“.class.php”)来加载Person类.实际上,它跟require/include差不多,不同的它可以指定多个扩展名" title="扩展名">扩展名.PHP实例

怎 样让spl_autoload自动起作用呢,也便是将autoload_func指向spl_autoload?答案是使用 spl_autoload_register函数.在PHP脚本中第一次调用spl_autoload_register()时不使用任何参数,就可以将 autoload_func指向spl_autoload.PHP实例

通过上面的说明我们知道,spl_autoload的功能比较简单,而且它是在SPL扩展中实现的,我们无法扩充它的功能.如果想实现本身的更灵活的自动加载机制怎么办呢?这时,spl_autoload_call函数闪亮登场了.PHP实例

我 们先看一下spl_autoload_call的实现有何奥妙之处.在SPL模块内部,有一个全局变量autoload_functions,它本质上是 一个HashTable,不过我们可以将其简单的看作一个链表,链表中的每一个元素都是一个函数指针,指向一个具有自动加载类功能的函数. spl_autoload_call本身的实现很简单,只是简单的按顺序执行这个链表中每个函数,在每个函数执行完成后都判断一次需要的类是否已经加载,如果加载成功就直接返回,不再继续执行链表中的其它函数.如果这个链表中所有的函数都执行完成后类还没有加载,spl_autoload_call就直接 退出,并不向用户报告错误.因此,使用了autoload机制,并不能保证类就一定能正确的自动加载,关键还是要看你的自动加载函数如何实现.PHP实例

在php5中的标准库办法spl_autoload相当于实现自己的__autoloadPHP实例

代码如下:

<?php
??? function __autoload($classname){
??????? if(is_file($classname.'.php'){
??????????? include $classname.'.php';
??????? } elseif(is_file($classname.'.inc'){
??????????? include $classname.'.inc';
??????? }
??? }

它会在注册目录下自动寻找与$classname同名的.php/.inc文件.当然,你也可以指定特定类型的文件,办法是注册扩展名PHP实例

代码如下:

<?php
??? spl_autoload_extensions('.php,.inc,.some');

这样,它也会搜索.some文件.默认,php是不会启动spl_autoload的,那么怎样才能自动让spl_autoload生效呢呢?办法是PHP实例

代码如下:

<?php
??? spl_autoload_register();

spl_autoload_register有一个$callback参数,如果不指定,它就会自动注册spl_autoload,为了能搜寻更多的自动加载目次,可以在这些代码前面设置自动加载目次PHP实例

代码如下:

<?php
??? set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);

这样,当php找不到指定的类时,就会在set_include_path指定的目次下寻找.PHP实例

这些办法常用在php框架中.比如把上面的介绍串连起来:PHP实例

代码如下:

<?php
set_include_path(get_include_path() . PATH_SEPARATOR . 'some/path' . DIRECTORY_SEPARATOR);
spl_autoload_extensions('.php,.some');
spl_autoload_register();

当你要加载some/path下面的classA类时,它会在目录下寻找classa.php或classa.inc或classa.some,这样你就可以宁神地运用new classA或extends classAPHP实例

代码如下:

<必修php
??? ClassB extends ClassA {
??????? // code..
??? }

??? $a = new ClassA;
??? $b = new ClassB;
PHP实例

《php中spl_autoload详解》是否对您有启发,欢迎查看更多与《php中spl_autoload详解》相关教程,学精学透。编程之家 52php.cn为您提供精彩教程。

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读