首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >什么是自动加载;如何使用spl_autoload、__autoload和spl_autoload_register?

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

Stack Overflow用户
提问于 2011-10-05 01:07:06
回答 3查看 99.3K关注 0票数 218

我正在学习先进的PHP标准,并试图实现新的和有用的方法。之前我使用__autoload只是为了避免在每个页面上包含多个文件,但最近我在__autoload manual上看到了一个技巧

spl_autoload_register()

为自动加载类提供了一种更灵活的选择。因此,不鼓励使用__autoload(),将来可能会弃用或删除。

但是我真的搞不懂如何实现spl_autoloadspl_autoload_register

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2011-11-03 04:45:39

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

举个例子:

代码语言:javascript
复制
spl_autoload_register('myAutoloader');

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

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

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

$myClass = new MyClass();

在上面的示例中,"MyClass“是您试图实例化的类的名称,PHP将此名称作为字符串传递给spl_autoload_register(),它允许您拾取变量并使用它来”包含“适当的类/文件。因此,您不需要特别通过include /requied语句来包含该类...

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

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

示例:

代码语言:javascript
复制
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扩展名的自定义配置文件,那么您可以使用的一种策略是(通过set_include_path())将包含所有文件的目录添加到PHP路径。

由于还需要配置文件,因此可以使用spl_autoload_extensions()列出要查找的扩展名。

示例:

代码语言:javascript
复制
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。

希望这能帮到你。

票数 371
EN

Stack Overflow用户

发布于 2013-01-13 22:09:28

从PHP5.3开始,你可以通过命名空间使用spl_autoload_register(),这意味着你可以组织你的项目并自动加载你的PHP类,而不需要任何require或include,也不需要重新定义__autoload()函数。

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

代码语言:javascript
复制
<?php
spl_autoload_register();
var_dump(new Main\Application);

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

代码语言:javascript
复制
<?php namespace Main;
class Application{}
票数 14
EN

Stack Overflow用户

发布于 2019-06-24 02:57:24

下面是我使用Autoload的方法。在给定的示例中,我希望从3个不同的目录加载类。

代码语言:javascript
复制
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。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/7651509

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档