`
beeyon
  • 浏览: 23273 次
  • 性别: Icon_minigender_1
  • 来自: 厦门
社区版块
存档分类
最新评论

转__autoload && spl_autoload_register

    博客分类:
  • php
PHP 
阅读更多

设我们有一个类文件A.php,里面定义了一个名字为A的类:

<?php   
class A   
{   
    public function __construct()   
    {   
        echo 'Got it.';   
    }   
}

<?php
class A
{
    public function __construct()
    {
        echo 'Got it.';
    }
}

 
然后我们有一个index.php需要用到这个类A,常规的写法就是

<?php   
require('A.php');   
$a = new A();

<?php
require('A.php');
$a = new A();

 
但是有一个问题就是,假如我们的index.php需要包含的不只是类A,而是需要很多类,这样子就必须写很多行require语句,有时候也会让人觉得不爽。


不过在php5之后的版本,我们就不再需要这样做了。在php5中,试图使用尚未定义的类时会自动调用__autoload函数,所以我们可以通过编写__autoload函数来让php自动加载类,而不必写一个长长的包含文件列表。

例如在上面那个例子中,index.php可以这样写:

<?php   
function __autoload($class)   
{   
    $file = $class . '.php';   
    if (is_file($file)) {   
        require_once($file);   
    }   
}   

$a = new A();

<?php
function __autoload($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}

$a = new A();

 


当然上面只是最简单的示范,__autoload只是去include_path寻找类文件并加载,我们可以根据自己的需要定义__autoload加载类的规则。

此外,假如我们不想自动加载的时候调用__autoload,而是调用我们自己的函数(或者类方法),我们可以使用spl_autoload_register来注册我们自己的autoload函数。它的函数原型如下:
bool spl_autoload_register ( [callback $autoload_function] )

我们继续改写上面那个例子:

<?php   
function loader($class)   
{   
    $file = $class . '.php';   
    if (is_file($file)) {   
        require_once($file);   
    }   
}   

spl_autoload_register('loader');   

$a = new A();

<?php
function loader($class)
{
    $file = $class . '.php';
    if (is_file($file)) {
        require_once($file);
    }
}

spl_autoload_register('loader');

$a = new A();

 


这样子也是可以正常运行的,这时候php在寻找类的时候就没有调用__autoload而是调用我们自己定义的函数loader了。同样的道理,下面这种写法也是可以的:

<?php   
class Loader   
{   
    public static function loadClass($class)   
    {   
        $file = $class . '.php';   
        if (is_file($file)) {   
            require_once($file);   
        }   
    }   
}   

spl_autoload_register(array('Loader', 'loadClass'));   

$a = new A();

 

分享到:
评论

相关推荐

    PHP中spl_autoload_register()和__autoload()区别分析

    4. 如果项目中已经实现了__autoload()函数,那么必须显式地使用spl_autoload_register('__autoload')将其加入自动加载栈中,因为spl_autoload_register()函数会将Zend Engine中的__autoload()函数取代为spl_autoload...

    spl_autoload_register与autoload的区别详解

    spl_autoload_register(PHP 5 &gt;= 5.1.2)spl_autoload_register — 注册__autoload()函数说明bool spl_autoload_register ([ ...因为spl_autoload_register()函数会将Zend Engine中的__autoload函数取代为spl_autoload

    PHP函数spl_autoload_register()用法和__autoload()介绍

    这是因为在spl_autoload_register()函数内部,它会将Zend引擎中原有的__autoload()函数替换为spl_autoload()或spl_autoload_call()。 至于自动加载函数的编写,通常需要编写一个能够根据类名来定位并包含类文件的...

    PHP中spl_autoload_register()函数用法实例详解_.docx

    本文将深入探讨`spl_autoload_register()`的用法及其在实际开发中的应用。 首先,我们来看一下`__autoload`函数。在PHP5中,当尝试实例化一个未定义的类时,系统会自动调用`__autoload`函数。这个函数接受一个参数...

    PHP中spl-autoload-register()函数用法实例详解-.docx

    与 __autoload 函数不同,spl_autoload_register() 函数可以注册多个自动加载函数,以便在实例化未定义的类时自动加载该类的类文件。 例如,我们可以使用 spl_autoload_register() 函数来注册 loadprint 函数: ``...

    php __autoload自动加载功能详解

    spl_autoload_register('autoload_function'); ``` 在这个例子中,`$class_name`是未定义的类名,我们将其转换为文件路径,然后尝试包含对应类的文件。如果文件不存在,将输出错误信息。 三、大写字母位置查找算法...

    php中spl_autoload详解

    当你首次调用 `spl_autoload_register()` 且不传递参数时,它会将 `autoload_func` 指向 `spl_autoload`。这样,当PHP尝试实例化一个未定义的类时,`spl_autoload_register` 就会按照注册的顺序逐个调用这些自动加载...

    PHP中spl_autoload_register函数的用法总结

    当调用`spl_autoload_register`时,它会将`__autoload`函数替换为`spl_autoload`或`spl_autoload_call`,从而管理整个自动加载栈。 让我们看一个实际的例子。假设我们有一个名为`A.php`的文件,其中定义了一个类`A`...

    PHP中spl-autoload-register()函数用法实例详解-.pdf

    下面我们将详细介绍 spl_autoload_register() 函数的用法实例。 一、__autoload 函数 在 PHP5 中,__autoload 函数是一个自动加载函数,当我们实例化一个未定义的类时,就会触发此函数。例如: printit.class....

    PHP中spl_autoload_register()函数用法实例详解

    需要注意的是,如果你的代码中已经有了 `__autoload` 函数,你需要将其显式地注册到自动加载栈中,因为 `spl_autoload_register()` 会替换掉 Zend Engine 中的 `__autoload` 函数。 SPL(Standard PHP Library)是...

    PHP spl_autoload_register实现自动加载研究

    bool spl_autoload_register ([ callback $autoload_function [, bool $throw = true [, bool $prepend = false ]]]) ``` - `$autoload_function`:这是必须的参数,用来指定一个或多个自动加载函数。这些函数会在...

    autoload机制

    spl_autoload_register(function ($class_name) { // 自定义的加载规则 }); ``` 5. **SPL Autoload的优点** 使用SPL Autoload,我们可以方便地管理和组织多个自动加载函数,避免了单一`__autoload()`函数的...

    php中使用__autoload()自动加载未定义类的实现代码

    然而,随着PHP 5的引入,最佳实践逐渐转向了使用SPL(Standard PHP Library)中的spl_autoload_register()函数来注册多个自动加载函数,这种做法更为灵活和健壮,尤其是在大型项目中。 尽管如此,了解__autoload()...

    PHP autoload与spl_autoload自动加载机制的深入理解

    PHP中的autoload机制是为了解决在面向对象编程中类的自动加载问题,从而简化了开发流程并提升...通过spl_autoload_register()注册的自动加载函数,开发者可以灵活地处理类文件的加载逻辑,以适应项目中不断变化的需求。

Global site tag (gtag.js) - Google Analytics