什么是自动加载; 你如何使用spl_autoload,__autoload和spl_autoload_register?
我正在学习高级PHP标准,并试图实现新的有用的方法。 之前我使用__autoload
只是为了逃避包括每个页面上的多个文件,但最近我看到__autoload manual
上的提示
spl_autoload_register()为自动加载类提供了更灵活的select。 出于这个原因,使用__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把这个名字作为一个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{}