php class Autoloader是否打开文件并检查类名?我一直在研究它是如何实际实现的。有一件事我知道它的递归?如果我错了请告诉我
如上所述:autoloader brief over view PHP Autoloader的工作原理
PHP Autoloader在已定义的目录中递归搜索 类,特征和接口定义。没有任何进一步 配置需求文件所在的目录 用作默认类路径。
文件名不需要遵守任何约定。搜索所有文件 用于类定义。与类名或类似的文件 以.php或.inc结尾是首选。如果支持,PHP Tokenizer将 用于可靠的类定义发现。
答案 0 :(得分:15)
PHP自动加载器只是构建类时包含文件的机制。
如果您将所有课程都放在1个文件中,则不需要自动加载器。当然,在编写OO时,你会为每个类提供自己的文件,而这就是自动加载器的用武之地。
一些例子:
class AutoLoader
{
public function __construct()
{
spl_autoload_register( array( $this, 'ClassLoader' ));
}
public function ClassLoader( $class )
{
if( class_exists( $class, false ))
return true;
if( is_readable( 'path_to_my_classes/' . $class . '.php' ))
include_once 'path_to_my_classes/' . $class . '.php'
}
}
$autoloader = new AutoLoader();
这里发生的是当创建自动加载器类时,类方法Classloader被注册为自动加载器。
创建新类时,Classloader方法首先检查该类的文件是否已加载。如果没有,则该类前面有一个路径并扩展了扩展名。如果文件是可读的,则包括在内。
当然,你可以把它变得非常复杂。让我们看一下名称空间和映射器的示例。假设我们在自动加载器类中:
private $mapper array( 'Foo' => 'path_to_foo_files/', 'Bar' => 'path_to_bar_files/');
public function ClassLoader( $class )
{
if( class_exists( $class, false ))
return true;
// break into single namespace and class name
$classparts = explode( '\\', $class );
$path = $this->mapper[$classparts[0]];
if( is_readable( $path . $classparts[1] . '.php' ))
include_once $path . $classparts[1] . '.php'
}
这里,classname在命名空间部分和classname部分中分开。命名空间部分在映射器数组中查找,然后该路径用作php文件的包含路径。
这些只是展示自动加载器可以做什么的示例。对于生产,还有一些工作要做,例如错误检查。