我正在学习高级 PHP 标准并尝试实施新的有用的方法。早些时候我__autoload只是用来逃避在每个页面上包含多个文件,但最近我看到了一个关于__autoload manual
spl_autoload_register()为自动加载类提供了更灵活的替代方案。出于这个原因,不鼓励使用__autoload()并且将来可能会弃用或删除。
但我真的不知道如何实施spl_autoload和spl_autoload_register
我正在学习高级 PHP 标准并尝试实施新的有用的方法。早些时候我__autoload只是用来逃避在每个页面上包含多个文件,但最近我看到了一个关于__autoload manual
spl_autoload_register()为自动加载类提供了更灵活的替代方案。出于这个原因,不鼓励使用__autoload()并且将来可能会弃用或删除。
但我真的不知道如何实施spl_autoload和spl_autoload_register
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。
希望这可以帮助...
从 PHP 5.3 开始,您可以使用spl_autoload_register()命名空间,这意味着您可以组织您的项目并自动加载您的 php 类,而无需任何要求或包含,也无需重新定义__autoload()函数。
为了演示这种行为,只需创建一个名为 index.php 的文件:
<?php
spl_autoload_register();
var_dump(new Main\Application);
然后在 index.php 文件旁边创建一个名为 Main 的文件夹。最后,在 Main 中创建一个名为 Application.php 的文件,并将以下代码粘贴到其中:
<?php namespace Main;
class Application{}
这是我使用 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 将使用这三种不同的文件名格式在这三个目录中查找命名空间\类。