扣丁学堂之2018PHP命名空间解析
2018-08-16 14:11:06
350浏览
很多学习或者参加PHP培训的同学都会接触到"PHP命明空间"这个词,其实命名空间在php5.3中被引入,如果说php最重要的新特性是什么,那么无疑是命名空间,他是现代php生态的基石。今天就跟着小编来学习一下吧。
诞生背景
当项目变大,类名会有重复的问题
假设你和你的搭档在开发一个大型系统。现在你在my文件夹下新建了一个Article类,你的搭档在partner文件夹中也新建了一个Artcle类,我们知道Article这样一个类名是非常常见的,所以你们不约而同的选择了这个命名。但是当你把他们inclue到index.php中并实例化Article类后发现,系统报了一个错误,错误显示类名有冲突。
/my/Article.php
<?php
classArticle{
//...
}
/partner/Article.php
<?php
classArticle{
//...
}
index.php
<?php
include'my/article.php';
include'partner/article.php';
$article=newArticle();
机智的你很快发现了,是由于你们俩取了同一个类名,那么如何解决这个问题呢?
早期的时候,大家想到的办法是,加前缀,就像下面这样,在每个类名前面加上不同的前缀来防止类名冲突。
<?php
classMy_Article{
//...
}
但是这样做你会发现存在一些问题:
类名容易变得很长
有些类名一开始你以为经过自己精心设计不会很别人重复,但最后还是重复了,因为这种办法无法保证不重复
这些类因为要考虑到会冲突的问题,命名往往无法准确而利索的表达类的作用。
如果我要打造一个框架,几乎所有的常见类:Request,Response,Model,等都得加上前缀,参见zend,ci等框架。
命名空间登场
接下来,命名空间登场了,他是如何完美解决这个问题的呢?
命名空间按照一种虚拟的层次结构组织php代码,这种层次结构类似于操作系统中文件系统的目录结构。
就像下面这样,在每个类中,定义它的命名空间,就如同将定义的类放入都一个特定的文件夹中,然后实例化类时指出他的命名空间就可以了。
/my/Article.php
<?php
namespacemy;
classArticle{
//...
}
/partner/Article.php
<?php
namespacepartner;
classArticle{
//...
}
index.php
<?php
include'my/article.php';
include'partner/article.php';
usemy\Article;
$article=newArticle();
$article=newpartner\Article();
$post=newmy\Article();
使用命名空间的好处
避免了冗长的类名、方法名。
以类似于文件系统的层次结构组织php代码,更利于理解。
打破了第三方组件间的沟通壁垒。
psr-4自动加载和composer
也许你发现了,在每次我们实例化一个类之前,总是需要使用include或者required来引入一个类,这样一个一个引入太麻烦,再有了命名空间以后,一些php核心开发者就提出psr-4这个规范,psr-4规范提出了如何利用命名空间和文件目录的对应关系来实现自动加载。
正是有了命名空间,psr-4自动加载才得以实现,在psr-4之前,还有一个psr-0自动加载规范,已被遗弃。
Composer非常优雅的实现了psr-4的自动加载机制,使得我们引用类的时候,几乎完全不用管类是如何加载的,
一个真实的php组件,往往有一个唯一的厂商命名空间,组件定义好后放入vendor文件夹中,我们不用做任何的处理就能够直接使用这个组件。
这样的编码方式极大的解放了程序员的劳动力,使得所有的php组件间的沟通更加的流畅了
以上就是扣丁学堂PHP培训小编给大家分享的文章,希望对小伙伴们有所帮助,想要了解更多关于PHP开发方面内容的小伙伴可以登录扣丁学堂官网咨询。扣丁学堂不仅有专业的PHP培训班供大家学习,还有与时俱进的课程体系和大量的
PHP在线视频教程让学员免费观看学习,想要快速学习PHP开发就到由专业老师授课的扣丁学堂学习吧。扣丁学堂PHP技术交流群:374332265。
【关注微信公众号获取更多学习资料】
查看更多关于“php培训资讯”的相关文章>>
标签:
PHP培训
PHP视频教程
PHP开发工程师