php中spl

 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="扩展名">扩展名。

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

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

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

在php5中的标准库方法spl_autoload相当于实现自己的__autoload

 

代码如下:

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

 

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

 

代码如下:

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

 

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

 

代码如下:

<?php
    spl_autoload_register();

 

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

 

代码如下:

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

 

这样,当php找不到指定的类时,就会在set_include_path指定的目录下寻找。

这些方法常用在php框架中。比如把上面的介绍串连起来:

 

 代码如下:

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

 

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

 

代码如下:

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

 

    $a = new ClassA;
    $b = new ClassB;

时间: 2024-09-19 07:45:16

php中spl的相关文章

php中SPL spl_autoload_register与__autoload方法使用

spl_autoload_register()函数应该是主流框架使用最多的也是非常核心的函数之一,可实现自动注册函数和类,实现类似__autoload() 函数功能,简化了类的调用与加载,提高了工作的效率. 支持版本:PHP 5 >= 5.1.2 至于效率问题.php手册上有如此之话: bool spl_autoload_register ([ callback $autoload_function ] ) 将函数注册到SPL __autoload函数栈中.如果该栈中的函数尚未激活,则激活它们.

PHP SPL标准库中的常用函数介绍

  这篇文章主要介绍了PHP SPL标准库中的常用函数介绍,本文着重讲解了spl_autoload_extensions().spl_autoload_register().spl_autoload()三个函数,需要的朋友可以参考下 PHP SPL标准库中提供了一些函数用来处理如自动加载.迭代器处理等. spl_autoload_extensions()添加spl_autoload()可加载的文件扩展名 spl_autoload_register()注册函数到SPL __autoload函数栈中

帮忙两个存储过程:查询表中第11-20行的数据(分页)spl server 和orcle两个版本

问题描述 谁帮忙写两个存储过程 急需:查询表中第11-20行的数据(分页)spl server 和orcle两个版本 谢谢 解决方案 SQLServer的 SELECT TOP 页大小 * FROM TestTable WHERE (ID > (SELECT MAX(id) FROM (SELECT TOP 页大小*页数 id FROM 表 ORDER BY id) AS T)) ORDER BY ID ----------------------------------------------

PHP SPL标准库中的常用函数介绍_php技巧

PHP SPL标准库中提供了一些函数用来处理如自动加载.迭代器处理等. spl_autoload_extensions()添加spl_autoload()可加载的文件扩展名 spl_autoload_register()注册函数到SPL __autoload函数栈中. 复制代码 代码如下: /*test1.php*/ <?php class Test1 { }   /*test2.lib.php*/ <?php class Test2 { }   /*test.php*/ <?php /

深入理解php中的ini配置(1)

这篇文章不会详细叙述某个ini配置项的用途,这些在手册上已经讲解的面面俱到.我只是想从某个特定的角度去挖掘php的实现机制,会涉及到一些php内核方面的知识:-)   使用php的同学都知道php.ini配置的生效会贯穿整个SAPI的生命周期.在一段php脚本的执行过程中,如果手动修改ini配置,是不会启作用的.此时如果无法重启apache或者nginx等,那么就只能显式的在php代码中调用ini_set接口.ini_set是php向我们提供的一个动态修改配置的函数,需要注意的是,利用ini_s

PHP5中新增stdClass 内部保留类

stdClass类是PHP的一个内部保留类,初始时没有成员变量也没成员方法,所有的魔术方法都被设置为NULL,可以使用其传递变量参数,但是没有可以调用的方法.stdClass类可以被继承,只是这样做没有什么意义. 该类是PHP的保留类,并不是所有类的基类. 复制代码 代码如下: <?php class foo {} $bar = new foo(); echo $bar instanceof stdClass?'yes':'no'; //output:no 另外一个例子: 复制代码 代码如下:

IIS中的MIME格式

iis|mime IIS中的MIME格式,按类型/子类型排序 下面的表格列出了按MIME内容类型/子类型排序的MIME内容类型,这些类型是在IIS 4.0 和IIS 5.0中注册的. 类型/子类型 扩展名 IIS 4.0 IIS 5.0 application/envoy evy 是 是 application/fractals fif 否 是 application/futuresplash spl 否 是 application/hta hta 否 是 application/interne

谈PHP 闭包特性在实际应用中的问题

PHP5.3 新版本跟随了很多新特性, 其中比较惹眼的特性之一就是支持了闭包.那么以后,我们也可以和那帮写 Ruby.Javascript 等等高科技语言的家伙们一样,写出非常酷的代码吗?呃,其实大部分情况下是可以的,而有些方面还是令人非常的困扰,下面慢慢道来. PHP5.3 新版本跟随了很多新特性, 其中比较惹眼的特性之一就是支持了闭包.那么以后,我们也可以和那帮写 Ruby.Javascript 等等"高科技语言"的家伙们一样,写出非常酷的代码吗?呃,其实大部分情况下是可以的,而有

关于在php.ini中添加extension=php

在配置php5时要使用mysql作为数据库,很多人都认为只要在php.ini中添加extension=php_mysql.dll;指令即可,不清楚为什么很多文章都推荐还要添加extension=php_mysqli.dll;指令. 只要查看官方最新php手册便知,上面写到: 下面是内置的扩展库列表:  PHP 5 中(截止到 5.0.4)有以下修改.新增内置:DOM,LibXML,Iconv,SimpleXML,SPL 和SQLite.以下不再内置:MySQL 和 Overload. 原来php