自动加载是一个很是核心的功能。在没有自动加载的时候,引用某个文件,经常须要一个很长的列表(须要把用到的)。
先用一个简单的样例:__autoload() 能够作到当在实例化某个没有的类的时候,会自动加载读取到的没有加载的文件名。须要保持文件名和类名是一致的
写俩个文件 一个 in.php
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有
ui
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当大量这样进行约定进行调用的时候,会很是麻烦,因而出现了命名空间。
调用的时候,只须要命名空间就能够约定 见下列示例
spa
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空间里的方法相似于写目录的方法。自动加载进行解析的时候,就须要进行一些灵活的变更。
命名空间和文件引用没有必然关系,可是在解析的时候,会遇到一个比较复杂的判断状况。
code