以下都是我自己的理解。如有错误,请见谅。
文章大纲:
使用名称空间的目的
如何使用名称空间
使用的目的使用
如何使用使用
使用namespace的目的:
处理团队项目时,避免与其他团队成员创建的新类发生冲突;个人负责项目时,避免新创建的班级前后冲突;
按照我个人的理解,在使用require类的时候,需要先引入require或者include,所以类重定义错误的前提是已经引入了两个同名的类。目前有些php框架会自动加载(即包含)所有新创建的模型类,所以为了避免你新创建的模型类和项目框架的原生核心类重名冲突,采用了namespace。(想了想,和团队成员创建的新类冲突应该通过沟通来避免。即使在事件发生后,也要重新调整类名进行即时维护,避免后期对类的理解混乱而导致维护的复杂性。)
结合使用方法进一步理解其用途。
namespace的使用方法:
为了测试,我将创建三个文件:1.php和name.php(这个文件用于测试),稍后将不再解释。请自行注意代码变化。
1.namespace后命名的定义不区分大小写
命名空间一;命名空间一;命名空间一;可以如上写,随便选一个作为自己的规格。(我用第一个代码来测试后面的代码。)
2. 没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠\\,也可以不加。
//1.php类Person { function _ _ construct(){ echo & # 39;我就是一个!';} }//name . PHP require _ once & # 39;。/1 . PHP & # 39;;新人();//输出我是一个!;new \\ Person();//输出我是一个!;
3. new类时,带上命名空间时,之间一定用反斜杠字符,而不是顺斜杠。
记忆法:按%中找到斜杠的顺序理解为正斜杠。(有时候说反斜杠,我都不知道是哪个方向。以前是按照从左到右上升的方向记的,现在觉得这个太不靠谱了。)
//name . phprequire _ once & # 39;。/1 . PHP & # 39;;new/Person();//代码错误:解析错误:语法错误,意外& # 39;/'
4.类在指定命名空间下, new类时,一定要带上指定的命名空间。
如果没有指定的命名空,根据第2点,php会从顶级命名空中找到这个类。记住:这不能理解为顶级命名空包含了所有其他命名空。而应该将顶级命名空与其他命名空完全区分开来。
//1.php命名空间一;class Person { function _ _ construct(){ echo & # 39;我就是一个!';}}
//name . phprequire _ once & # 39;。/1 . PHP & # 39;;新\\一\\人();//输出我是一个!;new \\ Person();//代码错误:致命错误:Class & # 39人& # 39;没找到可以拿这个通俗的例子来理解:拿指定的名字空代表某人的苹果(在他手里),顶名空代表苹果盒里的苹果(在盒子里)。如果你现在想找某人的苹果,带上某人的名字空,否则你会从盒子里找到某人的苹果,当然找不到。
5.命名空间声明后的代码便属于这个命名空间,即使有include或require也不影响(重点是对后半句的理解,具体看代码)。
//1.php命名空间一;class Person { function _ _ construct(){ echo & # 39;我就是一个!';}}
//name.phpnamespace测试;要求& # 39;。/1 . PHP & # 39;;新\\一\\人();//输出我是一个!;新人();//这里会有什么结果?猜猜看。
最后一行结果中的错误:
致命错误:类& # 39;测试\\人& # 39;未发现首先,这里有一个与第2点的对比:
第二点,我说了,当空和new class之间没有名字的时候,有没有反斜杠是一样的。
这里用空这个名字,有和没有反斜杠的意思是不一样的。
将最后一行替换为
new \\ Person();错误报告的结果:
致命错误:类& # 39;人& # 39;未发现
然后,再来说说目前的点位。
我们可以发现最后一行代码对应的名称空是test,它不受require文件中名称空的影响。
为了进一步加强核查,我对name.php文件作了如下修改:
//name.phpnamespace测试;要求& # 39;。/1 . PHP & # 39;;class Person { function _ _ construct(){ echo & # 39;我是测试!';} }新\\一\\人();//输出我是一个!;新人();//这里会有什么结果?自己猜。
最后,这个例子刷新了我对require的理解。
根据我之前对REQUE的理解:PHP程序在执行之前,会先读取REQUE指定的文件,并使其成为PHP程序网页的一部分。所以我往往简单的理解为替换,只是把提取出来的代码放回原来的地方。然后,我尝试将1.php文档的内容放入name.php:
//name.phpnamespace测试;命名空间一;class Person { function _ _ construct(){ echo & # 39;我就是一个!';} } class Person { function _ _ construct(){ echo & # 39;我是测试!';}}如果没有新类,文件将报告一个错误:
fatal error:CannotRedeclare Class One \\ person似乎简单地将require理解为replacement,这在这里不起作用。
6.namespace里不包含类名称,即使存在与类名称同名的部分,那也不代表类。new类时,还是得将这部分带上。
//name . phpnamespace test \\ person;class Person { function _ _ construct(){ echo & # 39;我是测试!';} }新\\考\\人\\人();//Naming 空 person不能代表类名,只是多此一举。简单明了,不要在名称空间中引入类名。
7.一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码。
就说第一个命名空之前不能有代码,后面的命名空之前可以有代码。这个可以自己测试。
//name.phpnamespace测试;回声& # 39;翟14 & # 39;;命名空间翟;要求& # 39;。/1 . PHP & # 39;;
php命名空之间的命名空间走到了尽头。先说使用目的。
使用use的目的:
当名称空之间的字符串太长时,请使用use相应地缩短名称空。
use的使用方法:1.new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。
//name.phpnamespace动物\\狗;class Life { function _ _ construct(){ echo & # 39;狗命!';} }命名空间动物\\猫;class Life { function _ _ construct(){ echo & # 39;猫命!';} }新生活();//根据代码执行顺序,animal\\cat默认名称为new \\ animal \\ dog \\ Life()between空;//Ause动物\\狗;//anew狗\\ Life();//Buse animal\\dog为d;//b new d \\ Life();
通过比较线A和线B,我们需要注意:
使用use后,新类前面没有反斜杠。
当不使用use时,名称空前面有一个反斜杠。
通过比较线A和线B,我们可以理解:
使用后没有as时,缩写命名空默认为最后一个反斜杠后的内容。如上:
用动物\\狗;胜任
用动物\\狗当狗;
2.namespace后面不建议加类名,但use后可以。
//name.phpnamespace动物\\狗;class Life { function _ _ construct(){ echo & # 39;狗命!';} }命名空间动物\\猫;class Life { function _ _ construct(){ echo & # 39;猫命!';} }用动物\\狗\\命当狗;新狗();如上图,使用后添加类名,相当于更改类名:从生命到狗。
如果您没有在它上面使用as dog,您将会报告一个错误:
Fatalerror:不能使用animal \\ dog \\ life作为Life,因为该名称已被使用,因为在cat下有一个同名的Life类。
可以理解为使用后,这个昵称对应的类只能被当前命名空占用,不允许存在于其他命名空下。
//name.phpnamespace动物\\狗;class Life { function _ _ construct(){ echo & # 39;狗命!';} } class Dog { function _ _ construct(){ echo & # 39;狗咬狗!';} }命名空间动物\\猫;//class Dog {//function _ _ construct(){//echo & # 39;猫里的狗!';//}//} class Life { function _ _ construct(){ echo & # 39;猫命!';} }用动物\\狗;新狗\\狗();如上所述
用动物\\狗;猫
通过上面的代码,我觉得使用use(命名空)的目的和效果很明显。
简单总结一下:
命名空间是划分域的功能,也就是说这些东西属于某个被命名的空。
Use只是起到一个昵称的作用,无论是写作还是口语都可以省很多事。
免责声明:本站所有文章内容,图片,视频等均是来源于用户投稿和互联网及文摘转载整编而成,不代表本站观点,不承担相关法律责任。其著作权各归其原作者或其出版社所有。如发现本站有涉嫌抄袭侵权/违法违规的内容,侵犯到您的权益,请在线联系站长,一经查实,本站将立刻删除。