PHP加入命名空间的好处--方便自动加载

一个PHP项目,通常只有一个入口文件index.php,我们通常会在这个入口文件中写入自动加载函数,用来require以后会实例化的类文件。如:

spl_autoload_register(function ($className) {
   require 'class/' . $className . '.php';
});

通过以上的代码,我们发现:在自动加载时,我们需要指定存放类的文件夹,以便找到相应的类。那么问题产生了。

在引入命名空间之前:

我们的项目目录

 

index.php

 

Controller.php

在index.php中我们需要实例化一个controller目录下的Controller类,并且调用这个对象的model()方法,而这个方法则需要实例化一个model目录下的Model类。我们运行一下index.php:

Warning: require(controller/Model.php): failed to open stream: No such file or directory

提示没有这个文件或目录。原因很简单:PHP在new Model()的时候,是自动去controller目录下去require的,所以找不到。

那么,我们的自动加载函数应该怎么写才能解决问题呢?很显然,把'controller/'换成'model/' 或者 不写目录,都不能正常加载。于是,使用命名空间的好处就显现出来了。

 

引入命名空间之后:

index.php

 

Controller.php

 

 

Model.php

我们按照文件目录的结构来为每个类写入命名空间,当在一个类中需要实例化另外一个类时,IDE会帮我们写入use namespace ;  。这样,我们在写自动加载的时候,就不用考虑将要加载的类在哪一个文件目录下了,只需要这样写:

spl_autoload_register(function ($class) {
   require $class . '.php';
});

因为我们在index.php中use了所用到的类的命名空间,自动加载函数会到相应的命名空间中去寻找类(上述代码中的$class就相当于是'controller\Controller'),而这些类中又需要实例化其他的类,因为这些类中也声明了use 其他类的命名空间 ;,所以自动加载函数又会去相应的命名空间中去require其他类。

这样,我们就不会为加载类而发愁了,极大地解放了我们的编程负担。


Leave a Comment