搜索
首页后端开发php教程PHP命令空间namespace及use的用法(实例)

PHP命令空间namespace及use的用法(实例)

May 17, 2018 am 10:02 AM
namespacephp实例

这篇文章主要介绍了PHP命令空间namespace及use的用法实践总结,需要的朋友可以参考下

命名空间一个最明确的目的就是解决重名问题,PHP中不允许两个函数或者类出现相同的名字,否则会产生一个致命的错误。这种情况下只要避免命名重复就可以解决,最常见的一种做法是约定一个前缀。

使用namespace的目的:

团队合作项目时,避免与团队其它成员新建的类发生冲突;个人负责项目时,避免前后新建的类发生冲突;

据个人理解,用到所需要的类时,需要先require或include引入,所以会发生类重定义的错误的前提是:两个相同命名的类都有被引入。目前有些php框架会自动加载(即include)所有新建的model类,所以为了避免你新建的model类和项目框架原生的核心类发生重名冲突,采用了namespace。(想了想,与团队成员新建的类产生冲突应该通过沟通避免,即使事发后也应该重新调整类名即时维护,避免后期造成因为对类的理解混淆而带来维护上的复杂度提高)

结合使用方法来进一步理解它的使用目的吧。

namespace的使用方法:

为了进行测试,我将创建3个文件:1.php和name.php(此文件用来执行测试),后面将不再说明,请自行注意代码的变化。

1.namespace后命名的定义不区分大小写

namespace one;
namespace One;
namespace ONE;

如上写法都可以,选择一种作为自己的规范即可。(后面代码我采用第一种进行测试哈)

2. 没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠\,也可以不加。

//1.php 
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new Person(); //输出 I am one!;
new \Person(); //输出 I am one!;

3. new类时,带上命名空间时,之间一定用反斜杠字符,而不是顺斜杠。

记忆方法:按找%中斜杠的顺序理解为顺斜杠。(有时说反斜杠,自己都不知道是哪种方向,以前按自左向右上升方向这种方向记忆,现在感觉这个太不靠谱了)

//name.php
require_once './1.php';
new /Person(); // 代码报错:Parse error: syntax error, unexpected '/'

4.类在指定命名空间下, new类时,一定要带上指定的命名空间。

没有带上指定的命名空间,按照第2点,php就会从顶级命名空间里找这个类。切记:这里不能按照顶级命名空间包含一切其它的命名空间来理解。而应该将顶级命名空间完完全全与其他命名空间区分开。

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
require_once './1.php';
new \one\Person(); //输出 I am one!;
new \Person(); //代码报错:Fatal error: Class 'Person' not found

可以举个这个通俗例子来理解:带上指定命名空间代表某人的苹果(在他手里),顶级命名空间代表苹果箱里的苹果(在箱子里)。现在要找某人的苹果,就将某人的命名空间带上,否则就会从箱子里找某人的苹果,结果当然是找不到。

5.命名空间声明后的代码便属于这个命名空间,即使有include或require也不影响(重点是对后半句的理解,具体看代码)。

//1.php 
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
//name.php
namespace test;
require './1.php'; 
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么呢,猜猜看

最后一行结果报错:

Fatal error: Class 'test\Person' not found

首先,这里与第2点比较一下:

第2点,我说,没有命名空间时,new类时,有没有反斜杠意义一样。

在这里,有了命名空间,有和没有反斜杠的意义就不一样了。

最后一行换成

new \Person();

结果报错:

Fatal error: Class 'Person' not found

接着,就说说当前这点。

我们可以发现,最后一行代码对应的命名空间为test,并没有受到require文件里的命名空间的影响。

进一步加强验证,我修改了name.php文件如下:

//name.php
namespace test;
require './1.php'; 
class Person{
 function __construct(){
  echo 'I am test!';
 }
}
new \one\Person(); //输出 I am one!;
new Person(); //这里结果会是什么,自己猜猜看

最后,这个例子刷新了我对require的认识了。

按照我以前对require的理解:PHP 程序在执行前,就会先读入 require 所指定引入的文件,使它变成 PHP 程序网页的一部分。所以我常常就简单的理解为替换,只不过把抽离出来的代码再放回原处而已。然后我试了将1.php文件内容放到name.php里:

//name.php
namespace test;
namespace one;
class Person{
 function __construct(){
  echo 'I am one!';
 }
}
class Person{
 function __construct(){
  echo 'I am test!';
 }
}

无需new类,该文件就会报错:

Fatal error:  Cannot redeclare class one\Person

看来简单的把require理解为替换,在这里行不通。

6.namespace里不包含类名称,即使存在与类名称同名的部分,那也不代表类。new类时,还是得将这部分带上。

//name.php
namespace test\person;
class Person{
 function __construct(){
  echo 'I am test!';
 }
}new \test\person\Person();  //命名空间里person无法代表类名

不过这样纯粹是画蛇添足,直接干脆点,namespace里不要带类名称就好。

7.一个php文件中可以存在多个命名空间,第一个命名空间前不能有任何代码。

只说第一个命名空间前不能有任何代码,之后的命名空间之前可以有代码。这个自行测试即可。

//name.php
namespace test;
echo 'zhai14';
namespace zhai;
require './1.php';

php命名空间namespace告一段落了,接下来说说use的用途。

使用use的目的:

在命名空间字符串过长时,使用use可以相应的缩短命名空间。

use的使用方法:

1.new类时,最前面无需用反斜杠。此外,use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
new Life(); //按照代码执行顺序,这里默认animal\cat这个命名空间
new \animal\dog\Life(); //A
use animal\dog; //a
new dog\Life(); //B
use animal\dog as d; //b
new d\Life();

 通过A、B行代码比较,需要注意:

使用use后,new类时,最前面没有反斜杠。

没使用use时,命名空间最前面有反斜杠

通过a、b行代码比较,可以理解:

use后没有as时,缩短的命名空间默认为最后一个反斜杠后的内容。如上的:

use animal\dog;

相当于

use animal\dog as dog; 

2.namespace后面不建议加类名,但use后可以。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
namespace animal\cat;
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog\Life as dog; 
new dog();

如上所示,use后加上类名后,就相当于把类改了个名称:由Life改为dog了。

上面不用as dog就会报错:

Fatal error:  Cannot use animal\dog\Life as Life because the name is already in use
因为cat下也有个一样名称的Life类。

可以理解为,使用use后,这个昵称对应的类只能归当前命名空间占有,其它命名空间下不允许存在该类。

//name.php
namespace animal\dog;
class Life{
 function __construct(){
  echo 'dog life!';
 }
}
class Dog{
 function __construct(){
  echo 'dog in dog!';
 }
}
namespace animal\cat;
// class Dog{
// function __construct(){
//  echo 'dog in cat!';
//  }
// }
class Life{
 function __construct(){
  echo 'cat life!';
 }
}
use animal\dog; 
new dog\Dog();

如上,使用了

use animal\dog;
cat

通过上面代码,我想使用use的目的效果(缩短命名空间名称)就很明显了。

简单总结一下:

namespace就是划分领域的作用,代表这些东西是属于某个命名空间下的。

use就是起小名的作用,不论写起来还是说起来都可以省不少事儿。

相关推荐:

PHP命令空间的用法大全

php user_error()函数的简介

有关php user_error()函数的文章推荐10篇

以上是PHP命令空间namespace及use的用法(实例)的详细内容。更多信息请关注PHP中文网其他相关文章!

声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
超越炒作:评估当今PHP的角色超越炒作:评估当今PHP的角色Apr 12, 2025 am 12:17 AM

PHP在现代编程中仍然是一个强大且广泛使用的工具,尤其在web开发领域。1)PHP易用且与数据库集成无缝,是许多开发者的首选。2)它支持动态内容生成和面向对象编程,适合快速创建和维护网站。3)PHP的性能可以通过缓存和优化数据库查询来提升,其广泛的社区和丰富生态系统使其在当今技术栈中仍具重要地位。

PHP中的弱参考是什么?什么时候有用?PHP中的弱参考是什么?什么时候有用?Apr 12, 2025 am 12:13 AM

在PHP中,弱引用是通过WeakReference类实现的,不会阻止垃圾回收器回收对象。弱引用适用于缓存系统和事件监听器等场景,需注意其不能保证对象存活,且垃圾回收可能延迟。

解释PHP中的__ Invoke Magic方法。解释PHP中的__ Invoke Magic方法。Apr 12, 2025 am 12:07 AM

\_\_invoke方法允许对象像函数一样被调用。1.定义\_\_invoke方法使对象可被调用。2.使用$obj(...)语法时,PHP会执行\_\_invoke方法。3.适用于日志记录和计算器等场景,提高代码灵活性和可读性。

解释PHP 8.1中的纤维以进行并发。解释PHP 8.1中的纤维以进行并发。Apr 12, 2025 am 12:05 AM

Fibers在PHP8.1中引入,提升了并发处理能力。1)Fibers是一种轻量级的并发模型,类似于协程。2)它们允许开发者手动控制任务的执行流,适合处理I/O密集型任务。3)使用Fibers可以编写更高效、响应性更强的代码。

PHP社区:资源,支持和发展PHP社区:资源,支持和发展Apr 12, 2025 am 12:04 AM

PHP社区提供了丰富的资源和支持,帮助开发者成长。1)资源包括官方文档、教程、博客和开源项目如Laravel和Symfony。2)支持可以通过StackOverflow、Reddit和Slack频道获得。3)开发动态可以通过关注RFC了解。4)融入社区可以通过积极参与、贡献代码和学习分享来实现。

PHP与Python:了解差异PHP与Python:了解差异Apr 11, 2025 am 12:15 AM

PHP和Python各有优势,选择应基于项目需求。1.PHP适合web开发,语法简单,执行效率高。2.Python适用于数据科学和机器学习,语法简洁,库丰富。

php:死亡还是简单地适应?php:死亡还是简单地适应?Apr 11, 2025 am 12:13 AM

PHP不是在消亡,而是在不断适应和进化。1)PHP从1994年起经历多次版本迭代,适应新技术趋势。2)目前广泛应用于电子商务、内容管理系统等领域。3)PHP8引入JIT编译器等功能,提升性能和现代化。4)使用OPcache和遵循PSR-12标准可优化性能和代码质量。

PHP的未来:改编和创新PHP的未来:改编和创新Apr 11, 2025 am 12:01 AM

PHP的未来将通过适应新技术趋势和引入创新特性来实现:1)适应云计算、容器化和微服务架构,支持Docker和Kubernetes;2)引入JIT编译器和枚举类型,提升性能和数据处理效率;3)持续优化性能和推广最佳实践。

See all articles

热AI工具

Undresser.AI Undress

Undresser.AI Undress

人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover

AI Clothes Remover

用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool

Undress AI Tool

免费脱衣服图片

Clothoff.io

Clothoff.io

AI脱衣机

AI Hentai Generator

AI Hentai Generator

免费生成ai无尽的。

热门文章

R.E.P.O.能量晶体解释及其做什么(黄色晶体)
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.最佳图形设置
3 周前By尊渡假赌尊渡假赌尊渡假赌
R.E.P.O.如果您听不到任何人,如何修复音频
3 周前By尊渡假赌尊渡假赌尊渡假赌
WWE 2K25:如何解锁Myrise中的所有内容
4 周前By尊渡假赌尊渡假赌尊渡假赌

热工具

Dreamweaver CS6

Dreamweaver CS6

视觉化网页开发工具

SecLists

SecLists

SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。

PhpStorm Mac 版本

PhpStorm Mac 版本

最新(2018.2.1 )专业的PHP集成开发工具

ZendStudio 13.5.1 Mac

ZendStudio 13.5.1 Mac

功能强大的PHP集成开发环境

SublimeText3 Linux新版

SublimeText3 Linux新版

SublimeText3 Linux最新版