ice*_*l89 6 php spl-autoloader
我真的没有得到spl_autoload的文档
bool spl_autoload_register ([ callback $autoload_function ] )
Run Code Online (Sandbox Code Playgroud)
根据我的理解,当php遇到未加载的类时,它将尝试运行已注册的函数.举个例子,
public function autoload() {
require ('nonLoadedClass.php');
}
spl_autoload_register(autoload);
$x = new nonLoadedClass();
Run Code Online (Sandbox Code Playgroud)
会导致要求运行吗?所以我还可以注册许多自动加载功能?
public function autoloadXXX() {...}
public function autoloadYYY() {...}
public function autoloadZZZ() {...}
spl_autoload_register('autoloadXXX');
spl_autoload_register('autoloadYYY');
spl_autoload_register('autoloadZZZ');
Run Code Online (Sandbox Code Playgroud)
在学说的情况下,
require_once(dirname(__FILE__) . '/lib/vendor/doctrine/Doctrine.php');
spl_autoload_register(array('Doctrine', 'autoload'));
Run Code Online (Sandbox Code Playgroud)
一个数组被传递,所以我想它会尝试在Doctrine类中运行自动加载功能(这是必需的)?
Pas*_*TIN 16
spl_autoloader_register 注册一个回调函数/方法,当你的代码试图使用一个未知的类时,它将被调用.
一个回调函数可以通过几种方式来描述:
'my_function'array('MyClass', 'myMethod')array($myObject, 'myMethod')在Doctrine的情况下,它似乎是第二种解决方案:如果使用PHP不知道的类,则自动加载器将调用Doctrine::autoload,将类名作为参数传递给它.
所以我还可以注册许多自动加载功能?
是的,您可以spl_autoload_register:
如果必须有多个自动加载功能,则
spl_autoload_register()允许此操作.它有效地创建了一个自动加载功能队列,并按照它们的定义顺序遍历每个功能.
但是我们通常不为每个类定义一个自动加载函数/方法; 我认为这样效率很低.
相反,我们使用自动加载功能接收的类名来决定应该包含哪个文件.
例如,自动加载功能可能如下所示:
function my_autoloader($className)
{
require LIBRARY_PATH . '/' . $className . '.php';
}
Run Code Online (Sandbox Code Playgroud)
诀窍在于,如果您的文件以它们包含的类命名,它立即变得更容易;-)
这就是为什么类通常使用PEAR约定命名的原因:My_Class_Name映射到文件My/Class/Name.php