其实纠结了很久要不要使用这个东西,但是看看了最新的框架laravel,cakephp等等的新版本都使用上了,所以还是随大流顺便学习下。
namespace和c++里面的概念差不多,只是用法有点差别。
首先,如果我在index.php文件中想使用db/mysql.php这个文件里的mysql这个类。
使用方法如下:
mysql.php文件:
namespace DB; class Mysql { public function index(){ echo 'im mysql'; } }
index.php文件
namespace test; // 声明当前文件为test命名空间下。 use DBMysql; //使用db命名空间下的mysql类,仅仅use DB;是不行的。!!!! include 'db/mysql.php'; //引入mysql.php这个文件。 $obj = new Mysql(); //这样就可以用了。
OK,继续,如果不想用use xxxx,也可以直接$obj = new DBMysql();前提是也要include mysql.php这个文件。这里有个细微差别。
$obj = new Mysql(); //首先在当前空间找,如果没有,再从公共区域查找mysql类.(这里的公共区域是指没有被命名空间包含的代码以及系统函数)
$obj = new DBMysql(); //从当前空间(这里假如是test)下的DB空间里 查找mysql类。(符合此要求的mysql声明为namespace testDB)
$obj = new DBMysql(); //从命名空间根部查找DB空间的mysql类。
注意:
其实对于没有用命名空间的项目来说,所有的class都是默认在这个命名空间下的。所以在这种项目里面new aaa()和new aaa()效果一样。
当有命名空间的项目,引入一个没有命名空间的文件A.php时,应该用new A()来实例化,如果不用,会在当前文件的NS下查找class A,是找不到的。
eg:
namespace ElfFrameworkView; class CoreView { function __construct() { require ELF_PATH . 'Vendor/Smarty/Libs/Smarty.class.php'; $obj = new Smarty(); //Smarty.class.php文件没有用NS,如果这行用new Smarty(),系统会在NS为ElfFrameworkView下找类名为Smarty的文件,是找不到的。 } }