自动加载是一个非常核心的功能。在没有自动加载的时候,引用某个文件,常常需要一个很长的列表(需要把用到的)。
先用一个简单的样例:__autoload() 可以做到当在实例化某个没有的类的时候,会自动加载读取到的没有加载的文件名。需要保持文件名和类名是一致的
写俩个文件 一个 in.php
<?php
class in {
public function test() {
echo '123';
}
public function test2() {
echo "456";
}
}
?>
另外一个文件index.php
<?php
function __autoload($class){
require $class.".php";
}
$a = new in();
$a->test();
?>
但是__autoload函数只能用一次,当俩个项目合在一起的时候,只有一个会生效,另外一个无法使用。于是增加了SPL函数
spl_autoload_register();
可以同时加载N种自动加载规则,最常用的,重改index.php有
function load($class){
include $class.".php";
}
spl_autoload_register("load");
new in();
自动加载虽然很好用,但是到了PHP5.3以后,引入了命名空间namespace后,自动加载的复杂度又得到了提升。这里先介绍下PHP5.3的命名空间新概念:命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。但是约定前缀,会带来大量的额外代码。报告里的评论和文章里的评论可能都有comment,Article和Board都有这个函数,于是要进行各自约定Article_comment,Board_comment当大量这样进行约定进行调用的时候,会非常麻烦,于是出现了命名空间。
调用的时候,只需要命名空间就可以约定 见下列示例
namespace test\index;
class test1 {
public function a() {
echo "a";
}
}
function b() {
return 7;
}
namespace test\test;
function b() {
return 5;
}
echo \test\index\b();
在namespace test\test的空间里,调用test\index空间里的方法类似于写目录的方法。自动加载进行解析的时候,就需要进行一些灵活的变动。
命名空间和文件引用没有必然关系,但是在解析的时候,会遇到一个比较复杂的判断情况。