PHP 的自动加载,之前常用的__autoload和spl_autoload_register,不过最近发现使用composer也可以帮助实现自动加载,也挺好用的,记录一下。
首先需要安装composer:linux下composer的安装
然后在项目根目录(根目录下有个index.php文件)创建library和Model目录和一个composer.json文件,在里面输入如下内容:
{ "autoload": { "classmap": [ "library", "Model" ] } }
注:上面内容的library和Model即为自动加载的目录,我们要自动加载的类文件就放在这些目录下。
然后我们在libaray目录下创建Hello.php,Model下创建World.php
World.php的内容:
namespace Model; class World { public function index() { echo '我是MY'; } }
Hello.php的内容:
namespace library; use Model\World; class Hello { public function index() { echo 'Hello World!'; (new World())->index(); } }
index.php里面的内容:
(new \library\Hello())->index();
可以看出,我们在Hello类的index方法里调用了World类的index方法,然后我们在index.php里有调用了Hello类的index方法,这时候我们去访问index.php肯定是要报错的,因为我们在调用前并没有引入对应的文件,PHP也不会自动加载。
这时候我们可以打开终端,切换到项目目录下,运行命令:
composer install
运行成功后会看到,在项目下生成可一个vendor目录,里面有不少文件,这时候我们只需要把生成的vendor/autoload.php引入到我们的index.php中就行了,index.php的内容修改为:
include "./vendor/autoload.php"; (new \library\Hello())->index();
然后我们再访问index.php,就正常了,借助composer,php文件实现了自动化加载,至于为什么,看看vendor目录下composer帮我们生成的文件就明白了。
目前,越来越多的php框架使用了namespace,用户在使用框架的过程中也未进行直接引入对应的文件,这会给人一种错觉:使用namespace后php会自动加载文件。其实这是错的,框架其实自己实现了一套自动加载机制,用的人没注意而已,一般是通过namespace算出文件的存储路径,然后实例化的时候,会触spl_autoload_register自动加载函数将文件引入。namespace和自动加载是两码事。