我正在学习高级PHP标准并尝试实现新的有用方法。之前我使用__autoload
只是为了逃避在每个页面上包含多个文件,但最近我看到了__autoload manual
上的提示
spl_autoload_register()提供了更灵活的替代方案 自动加载类。出于这个原因,使用 __ autoload()是 气馁,将来可能会被弃用或删除。
但我真的无法弄清楚如何实施spl_autoload
和spl_autoload_register
答案 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。