我们熟悉的命名空间
个人认为是现代php特性中的No1,就算你不知道其他现代php特性,那么命名空间是唯一必须得知道的,不然还怎么愉快的和php玩耍呢?
命名空间在 php5.3.0 中引入,是一个很重要的工具,其作用是按照一种虚拟的层次结构组织PHP代码,这种层次结构类似操作系统中文件系统的目录结构。现代的PHP组件( 我们熟悉的composer )和框架都放在各自全局唯一的厂商命名空间中,以免与其他厂商使用的常见类名冲突。
关键字: namespace
查看一个案例:
打开: 这就是我们php使用的组件composer包网站,不熟悉也没关系!输入 symfony/console 这是一个console组件,单独开发console程序非常好用,查看组件详情,进入到github的源代码中,也可以直接点击:
打开:Command/Command.php
查看12行代码:namespace Symfony\ Component \Console\Command;
namespace: 声明命名空间的关键字
Symfony: 在组件中我们认为这是一个厂商的名字,具有唯一性,在框架使用中,例如tp5.1 laravel中书写Controller或者Model或者自已定义的Service文件目录时,里面的类用App开头,其实那个是composer.json里面使用psr4自定义的根目录空间,后续文章会单独理解,哈哈哈哈
Component\Console\Command: 子命名空间
习惯用框架的朋友会又疑问?为什么子命名空间和目录结构不一样,请回到 打开composer.json 在52行代码:”psr-4″: { “Symfony\\Component\\Console\\”: “”… 这里表示根目录使用Symfony\\Component\\Console\\这个命名空间,后续文章会单独理解,哈哈哈哈
命名空间(或者子命名空间)的作用就是封装和组织相关的PHP类,就像在文件系统中把相关的文件放在同一个目录中一样。
PHP命名空间与操作系统的物理文件系统不同,这是一个虚拟概念,没必要和文件系统中的目录结构完全对应,虽然如此,但是大多数PHP组件为了兼容广泛使用的PSR-4自动加载标准,会把子命名空间放到文件系统的子目录中( 上面有说到哟! )
我们为何要使用命名空间?
一句话总结:解决同类名在一个项目中 冲突
组件的出现也是基于伟大的命名空间,为后续的PSR-4自动类加载做好铺垫。
如果你开发的是小型个人项目,只有少量的依赖,类名冲突可能不是问题。但是如果在团队中工作,卡覅有许多第三方依赖的大型项目,就要认真对待命名冲突问题,因为你无法控制项目依赖在全局命名空间中引入的类、接口、函数和常量。这就是为什么一定要在你的代码中使用命名空间的原因。
如何声明命名空间?
关键字:namespace 厂商(唯一全局,后面开发composer包你也可以用你自己名字,哈哈哈)\子命名空间;
例如:
namespace Origin\FirstDemo
大小写问题:无强制要求,建议驼峰命名,首字母大写,你要用小写也行哟!
厂商命名空间是最重要的命名空间,顶层命名空间用于识别品牌或者所属组织,必须具有全局唯一性,子命名空间没那么重要,不过有助于组织项目的代码
导入和别名
我们先来了解一个历史资源,现代phper可能没有用过,看看就好,在命名空间出现之前,PHP开发者使用Zend式的类名解决命名不冲突,因Zend框架而流行(感兴趣可以去学学,现在接触的项目只有古董级项目才会用Zend,哈哈哈)。
案例:Zend_Service_User_AddressService 类对应的文件 Zend/Service/User/AddressService.php
和我们现代的命名空间:Symfony\Component\Console\Command; 有点类似吧
导入: 告诉PHP使用哪个命名空间、类、接口、函数和常量,导入后不用输入全名了。
别名: 用一个简单的名称引用导入的类、接口、函数和常量。
直接来看例子:
写法一
$obj = new \Symfony\Component\Console\Command();
$obj->methodName();
写法二
use Symfony\Component\Console\Command;
$obj = new Command();
$obj->methodName();
写法三
use Symfony\Component\Console\Command as Com;
$obj = new Com();
$obj->methodName();
关键字:use as 使用非常简单吧! as 取别名通常用在类名一样,但是空间不一样,这个时候其中一个取别名,不然你需要使用写法一中,写完整的命名空间
很多人不知道的东西
PHP5.6开始可以导入函数和常量
use func Namespace\functionName;
functionName();
use constant Namespace\CONST_NAME;
echo CONST_NAME;
现代开发都是面向对象开发,所以函数用的比较少,常量应该见过吧!
后续会继续更新,感兴趣的小伙伴可以收藏下哟!
欢迎有问题或者项目开发有问题的小伙伴添加微信:wxmm686800,共同成长!
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~