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

我正在学习高级PHP标准,并试图实现新的有用的方法。 之前我使用__autoload只是为了逃避包括每个页面上的多个文件,但最近我看到__autoload manual上的提示

spl_autoload_register()为自动加载类提供了更灵活的select。 出于这个原因,使用__autoload()是不鼓励的,将来可能会被弃用或删除。

但我真的不知道如何实现spl_autoloadspl_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把这个名字作为一个string传递给spl_autoload_register() ,它允许你选取variables并用它来“包含”适当的类/文件。 因此,您并不需要通过include / require语句来包含该类。

只要简单地调用你想要实例化的类就像上面的例子一样,既然你注册了一个函数(通过spl_autoload_register() )你自己的将弄清楚你的类所在的位置,PHP将使用该函数。

使用spl_autoload_register()的好处是不像__autoload()你不需要在你创build的每个文件中都实现一个自动加载函数。 spl_autoload_register()还允许您注册多个自动加载function,以加快自动加载,并使其更容易。

例:

 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的自定义configuration文件,那么你可以使用的策略是添加包含所有文件的目录文件到PHP的包含path(通过set_include_path() )。
而且由于你也需要你的configuration文件,你可以使用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类,而不需要任何require和include,也不需要重新定义__autoload()函数。

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

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

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

 <?php namespace Main; class Application{}