什么是自动加载;你如何使用 spl_autoload、__autoload 和 spl_autoload_register?

问题描述 投票:0回答:3

我正在学习高级 PHP 标准并尝试实施新的有用方法。早些时候我使用

__autoload
只是为了逃避在每个页面上包含多个文件,但最近我看到了
__autoload manual

的提示

spl_autoload_register() 为 自动加载类。因此,使用 __autoload() 是 不鼓励,将来可能会被弃用或删除。

但我真的不知道如何实现

spl_autoload
spl_autoload_register

php autoload spl
3个回答
389
投票

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

例如:

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。


15
投票

自 PHP 5.3 起,您可以将

spl_autoload_register()
与命名空间一起使用,这意味着您可以组织您的项目并自动加载您的 php 类,而无需任何 require 或 include,也无需重新定义
__autoload()
函数。

为了演示这种行为,只需创建一个名为 index.php 的文件:

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

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

<?php namespace Main;
class Application{}

3
投票

这是我使用 Autoload 的方式。 在给定的示例中,我想从 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 将查找名称空间

© www.soinside.com 2019 - 2024. All rights reserved.