我正在学习先进的PHP标准,并试图实现新的和有用的方法。之前我使用__autoload只是为了避免在每个页面上包含多个文件,但最近我在__autoload manual上看到了一个技巧
spl_autoload_register()
为自动加载类提供了一种更灵活的选择。因此,不鼓励使用__autoload(),将来可能会弃用或删除。
但是我真的搞不懂如何实现spl_autoload和spl_autoload_register
发布于 2011-11-03 04:45:39
spl_autoload_register()允许您注册多个函数(或来自您自己的Autoload类的静态方法),它们将被放入堆栈/队列中,并在声明“新类”时按顺序调用。
举个例子:
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()还允许您注册多个自动加载功能,以加快自动加载速度并使其更容易。
示例:
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()列出要查找的扩展名。
示例:
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。
希望这能帮到你。
发布于 2013-01-13 22:09:28
从PHP5.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{}发布于 2019-06-24 02:57:24
下面是我使用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将使用这三种不同的文件名格式在这三个目录中查找namespace\class。
https://stackoverflow.com/questions/7651509
复制相似问题