使用namespace的目的:
团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突;
据个人理解,用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所有新建的model类,所以为了避免你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该通过沟通避免,即使事发后也应该重新调整类名即时维护,避免后期造成因为对类的理解混淆而带来维护上的复杂度提高)
namespace的使用方法:
1.namespace后命名的定义不区分大小写
2、一个PHP文件客房多个命名空间,第一个命名空间前不能有代码;namespace建议用类名
3. 没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠\,也可以不加。
4、在当前的namespace,会默认加上它的名称;在最前面加"\"就除外
5、类在指定命名空间下,new类时,一定要要带上指定的命苦空间;没有带上指定的命名空间,php就会从顶级命名空间里找这个类。
切记:这里不能按照顶级命名空间包含一切其它的命名空间来理解。而应该将顶级命名空间完完全全与其他命名空间区分开。
例子如下:
Anlis.php
php namespace one; class Animal{ function __construct() { echo "我的命名空间叫one!
"; } } new Animal(); //new \Animal();//C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\ anli .php中没有找到“Animal”类,这是因为顶级命名空间和其它的命名空间是分开的
namespace test;
class Person{
function __construct()
{
echo "我的命名空间叫test2!
";
}
}
namespace two;
class Person{ function __construct() { echo "我的命名空间叫Person!
"; } }
// new类时,带上命名空间时,之间一定用反斜杠字符;前面也要加“\”,如果不加最前面默认加上当前命名空间“two”,报错 new \one\Animal(); //new \Animal(); //代码报错:C:\phpStudy\PHPTutorial\WWW\test\yidian\namespace\ anli .php中没有找到Class 'Animal' new \test\Person();//指定的命名空间,输出"我的命名空间test2!" new Person();//默认加上当前的two
使用use的目的:
在命名空间字符串过长时,使用use可以相应的缩短命名空间。
use的使用方法:
1、new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。
2、use可以有别名,也可以直接用类名
注:在当前namespace,use不能同名,必须用as,否则报错
use one\Animal;//默认Animal类名 new Animal(); use test\Person as b;//使用别名 new b;
总结:
1、namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。
2、use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。