什么是自动加载;你如何使用spl_autoload,__ autoload和spl_autoload_register?

时间:2011-10-04 17:07:06

标签: php autoload spl

我正在学习高级PHP标准并尝试实现新的有用方法。之前我使用__autoload只是为了逃避在每个页面上包含多个文件,但最近我看到了__autoload manual上的提示

  

spl_autoload_register()提供了更灵活的替代方案   自动加载类。出于这个原因,使用 __ autoload()是   气馁,将来可能会被弃用或删除。

但我真的无法弄清楚如何实施spl_autoloadspl_autoload_register

3 个答案:

答案 0 :(得分:292)

spl_autoload_register()允许您注册PHP将放入堆栈/队列的多个函数(或来自您自己的Autoload类的静态方法),并在声明“new Class”时按顺序调用。

例如:

spl_autoload_register('myAutoloader');

function myAutoloader($className)
{
    $path = '/path/to/class/';

    include $path.$className.'.php';
}

//-------------------------------------

$myClass = new MyClass();

在上面的示例中,“MyClass”是您尝试实例化的类的名称,PHP将此名称作为字符串传递给spl_autoload_register(),这允许您获取变量并将其用于“包括”适当的类/文件。因此,您不需要通过include / require语句包含该类...

只需简单地调用你想要实例化的类,就像上面的例子一样,并且因为你注册了一个你自己的函数(通过spl_autoload_register()),它将找出所有类所在的位置,PHP将使用它功能

使用spl_autoload_register()的好处是,与__autoload()不同,您不需要在您创建的每个文件中实现自动加载功能。 spl_autoload_register()还允许您注册多个自动加载功能,以加快自动加载速度并使其更加轻松。

示例:

spl_autoload_register('MyAutoloader::ClassLoader');
spl_autoload_register('MyAutoloader::LibraryLoader');
spl_autoload_register('MyAutoloader::HelperLoader');
spl_autoload_register('MyAutoloader::DatabaseLoader');

class MyAutoloader
{
    public static function ClassLoader($className)
    {
         //your loading logic here
    }


    public static function LibraryLoader($className)
    {
         //your loading logic here
    }

关于spl_autoload,手册说明:

  

此函数旨在用作__autoload()的默认实现。如果没有指定其他内容并且在没有任何参数的情况下调用spl_autoload_register(),则此函数将用于以后对__autoload()的任何调用。

在更实际的术语中,如果您的所有文件都位于单个目录中,并且您的应用程序不仅使用.php文件,而且还使用.inc扩展名的自定义配置文件,那么您可以使用的一种策略是添加包含PHP所有文件的目录包括路径(通过set_include_path()) 由于您还需要配置文件,因此您可以使用spl_autoload_extensions()列出希望PHP查找的扩展名。

示例:

set_include_path(get_include_path().PATH_SEPARATOR.'path/to/my/directory/');
spl_autoload_extensions('.php, .inc');
spl_autoload_register();

由于spl_autoload是__autoload()魔术方法的默认实现,因此当您尝试实例化新类时,PHP将调用spl_autoload。

希望这会有所帮助......

答案 1 :(得分:11)

从PHP 5.3开始,您可以将spl_autoload_register()与名称空间一起使用,这意味着您可以组织项目并自动加载您的php类,而无需任何要求或包含,也无需重新定义__autoload()函数。

要演示此行为,只需创建一个名为index.php的文件:

<?php
spl_autoload_register();
var_dump(new Main\Application);

然后在index.php文件旁边创建一个名为Main的文件夹。最后,创建一个名为Application.php的文件,该文件位于Main中,并将以下代码粘贴到其中:

<?php namespace Main;
class Application{}

答案 2 :(得分:0)

这是我使用自动加载的方式。 在给定的示例中,我希望从3个不同的目录中加载类。

function namespaceAutoload($rawClass){

$class = str_replace('\\', DIRECTORY_SEPARATOR, $rawClass);

$possiblePaths[] = '..\sys\class\file.php';
$possiblePaths[] = '..\sys\class\lib\file.php';
$possiblePaths[] = '..\sys\class\class.file.inc.php';

foreach ($possiblePaths as $templatePath) {
    $path = str_replace(["\\", "file"], [DIRECTORY_SEPARATOR, $class], $templatePath);
    if (file_exists($path)) {
        require_once "$path";
        break;
    }
} spl_autoload_register("namespaceAutoload"); 

在给定的示例中,PHP将使用这三种不同的文件名格式在这三个目录中查找namespace \ class。

相关问题