关于php命名空间的作用问题 求解答啊

为什么很少有人在 PHP 项目中使用 namespace ? - 知乎50被浏览31118分享邀请回答51 条评论分享收藏感谢收起9添加评论分享收藏感谢收起查看更多回答中国领先的IT技术网站
51CTO旗下网站
PHP 5.3中的命名空间:你用过了么?
日前发布的PHP 5.3中,最重要的一个新特性就是命名空间的加入。命名空间对于C#和Java开发者而言都不是新事物了,不过这次出现在PHP当中还是有着相当重要的意义。
作者:黄永兵 译来源:| 10:18
【51CTO精选译文】命名空间是PHP 5.3中最重要的变化,对于C#和Java开发人员对这个词语非常熟悉了,他们终于可以更好地改变PHP应用程序的结构了。
为什么我们需要命名空间?
随着你的PHP代码库的增长,对之前定义的函数和类名进行修改时风险也更高了,当你试图增加第三方组件或插件时问题更严重,如果存在两个或两个以上的代码集实现了一个“Database”和“User”类会怎么样?
直到目前,唯一的解决办法是使用长的类/函数名,例如Wordpress在每个类和函数名前都使用了前缀“WP_”, Zend Framework使用了极具描述性的命名约定,导致类名非常冗长,如:
Zend_Search_Lucene_Analysis_Analyzer_Common_Text_CaseInsensitive
命名冲突问题可以使用命名空间来解决,PHP常量、类和函数可以被组合到命名空间库中。
如何定义命名空间?
默认情况下,所有常量、类和函数名都放在全局空间下,就和PHP支持命名空间之前一样。
在PHP文件的顶部使用一个关键字namespace就可以定义命名空间,它必须是第一个命令(declare除外),在它前面不能出现非PHP代码、HTML或空格。如:&&?php &&namespace&MyP &&&
这一行下面的代码都是指定给MyProject命名空间的,为相同代码块嵌套命名空间或定义多个命名空间是不可能的,如果你真这样干,只有最后一个命名空间才能识别,但你可以在同一个文件中定义不同的命名空间代码,如:&&?php &namespace&MyProject1; &&&namespace&MyProject2; &&&&namespace&MyProject3&{ &&&} &?& &
尽管这么干是可以的,但我建议你不要这么做,最好还是每个文件中只定义一个命名空间,免得把你弄糊涂了。
子命名空间
PHP允许定义具有层次的命名空间以便库能够细分,子命名空间使用一个反斜线字符(\)分隔,如:
◆MyProject\SubName
◆MyProject\Database\MySQL
◆CompanyName\MyProject\Library\Common\Widget1
调用命名空间代码
在lib1.php文件中我们使用App\Lib1 namespace命名空间定义了一个常量、一个函数和一个类,如:
lib1.php&?php &//&application&library&1 &namespace&App\Lib1; &&const&MYCONST&=&'App\Lib1\MYCONST'; &&function&MyFunction()&{ &&return&__FUNCTION__; &} &&class&MyClass&{ &&static&function&WhoAmI()&{ &&&return&__METHOD__; &&} &} &&
现在我们可以在另一个PHP文件包括这段代码,如:
myapp.php&?php &header('Content-type:&text/plain'); &require_once('lib1.php'); &&echo&\App\Lib1\MYCONST&.&"\n"; &echo&\App\Lib1\MyFunction()&.&"\n"; &echo&\App\Lib1\MyClass::WhoAmI()&.&"\n"; &&
在myapp.php中并没有定义命名空间,因此这段代码存在全局空间中,任何对MYCONST、MyFunction和MyClass的直接引用都会失败,因为它们存在于App\Lib1命名空间中,为了调用lib1.php中的代码,我们可以在\App\Lib1命名空间前添加前缀定义一个完全合格的名称,下面是我载入myapp.php时的输出结果:App\Lib1\MYCONST&& &App\Lib1\MyFunction&& &App\Lib1\MyClass::WhoAmI&
完全合格名称可以变得很长,定义长名称,如App-Lib1-MyClass,有一些明显的好处。
原文:How to Use PHP Namespaces, Part 1: The Basics
作者:Craig Buckler
【编辑推荐】
【责任编辑: TEL:(010)】
大家都在看猜你喜欢
原创原创原创热点头条
24H热文一周话题本月最赞
讲师:41630人学习过
讲师:27601人学习过
讲师:83062人学习过
精选博文论坛热帖下载排行
本书按照国家人事部、信息产业部全国计算机技术与软件专业资格(水平)考试要求编写,内容紧扣《网络管理员考试大纲》。全书共分为11章,覆...
订阅51CTO邮刊问题对人有帮助,内容完整,我也想知道答案
问题没有实际价值,缺少关键内容,没有改进余地
在 PHP 5.3之后加入了use来引用命名空间,然后就出现了比如:
new tool();
这样简化的操作。
然而,我知道不使用use,命名空间的三种被调用方式:
1、非限定方式 new tool()
2、限定方式 new Tool\tool()
3、完全限定方式 new \Tool\tool()
现在我理解了不需要use引入命名空间的操作方式,即上面3中方式。那么问题就是:
use \Tool\
区别在哪里?资料也是查找不到的。求助
============================ 问题已解决,答案如下 ======================================
前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
附上地址:
附上文本:
注意对命名空间中的名称(包含命名空间分隔符的完全限定名称如 FooBar以及相对的不包含命名空间分隔符的全局名称如 FooBar)来说,前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
所以,没有区别,而且不建议写根'\'。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
我觉得可以理解为,限定方式和非限定方式可以理解为我们文件引入时候的相对路径和绝对路径引入文件时候的区别,只是有点相同,不知道我理解的对不对,请各位大神指正一下,感谢!!!
答案对人有帮助,有参考价值
答案没帮助,是错误的答案,答非所问
use \Tool\tool 是从项目的根命名空间开始找
use Tool\tool 是从当前目录下的命名空间开始找
同步到新浪微博
分享到微博?
Hi,欢迎来到 SegmentFault 技术社区!⊙▽⊙ 在这里,你可以提出编程相关的疑惑,关注感兴趣的问题,对认可的回答投赞同票;大家会帮你解决编程的问题,和你探讨技术更新,为你的回答投上赞同票。
明天提醒我
关闭理由:
删除理由:
忽略理由:
推广(招聘、广告、SEO 等)方面的内容
与已有问题重复(请编辑该提问指向已有相同问题)
答非所问,不符合答题要求
宜作评论而非答案
带有人身攻击、辱骂、仇恨等违反条款的内容
无法获得确切结果的问题
非开发直接相关的问题
非技术提问的讨论型问题
其他原因(请补充说明)
我要该,理由是:PHP命名空间是PHP5.3开始支持。本篇讲解PHP命名空间用法和PHP命名空间详解。它的诞生使的我们在一个文件中可以使用多个同名的类而不冲突。
好处:我们的项目有一个记录日志文件的类,叫做Log。然后我们又必须要引入另一个代码包,这个代码包里也有一个叫做Log的类。那么在一个文件中,我们记录日志的又需要给两个类都写一条日志。可以类同名了,怎么办?这个时候,命名空间应运而生。在Java等语言中命名空间是很早就已经提供了支持,而我大PHP一直到5.3才对命名空间提供了支持。
文件index.php
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
$obj = new index();
$obj-&a();
echo '&br&';
$obj1 = new test\index();
$obj1-&a();
文件test.php
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
我们给index.php不设置命名空间,对test.php设置命名空间,名为test。运行index.php。
index : index::a
test\index : test\index::a
我们看到了,同名的类也可以运行而不冲突了。
文件index.php
include 'test.php';
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
$obj = new index();
$obj-&a();
echo '&br&';
$obj1 = new \test\index();
$obj1-&a();
文件test.php
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
我们给index.php设置命名空间,名为index,对test.php设置命名空间,名为test。运行index.php。
index\index : index\index::a
test\index : test\index::a
比较示例一和二,不对index.php设置命名空间,即该文件是整个PHP全局命名空间下面的一个文件,那么使用test\index()即可,如果对index.php设置命名空间,即在其他的命名空间中使用命名空间,就要多一个&\&,就要使用\test\index()。
文件index.php
include 'namespace.php';
use \test\test1\test2 as test2;
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
$obj = new index();
$obj-&a();
echo '&br&';
$obj1 = new \test\test1\test2\index();
$obj1-&a();
echo '&br&';
$obj1 = new test2\index();
$obj1-&a();
文件test.php
namespace test\test1\test2;
class index{
public function a(){
echo basename(__FILE__);
echo '&br&';
echo __CLASS__ . ' : ' . __METHOD__;
index\index : index\index::a
test\test1\test2\index : test\test1\test2\index::a
test\test1\test2\index : test\test1\test2\index::a
这说明了什么?别名!用过SQL吧。
select COUNT(*) as `count` from `tebleName`
嗯,一个意思。\test\test1\test2这个名字太长了,就别名为test2就好了。使用了use之后呢,这个命名空间就想到于是在index这个命名空间下面了,而不是全局命名空间的一员了,所以使用test2\index(),而不是\test2\index()。
别名时在PHP代码编译的时候执行的,而变量的解析则要更晚。也就是说不能对变量运用use关键字。示例如下(摘自官方手册示例):
use My\Full\Classname as Another, My\Full\NS
$obj = new A // 实例化一个 My\Full\Classname 对象
$a = 'Another';
$obj = new $a;
// 实际化一个 Another 对象
原文地址:
php知识点必读史上最难PHP笔试题答案
1、有关PHP字符串的说法,不对的是: C
A、如果一个脚本的编码是ISO-8859-1,则其中的字符串也会被编码为 ISO-8859-1。
B、PHP的字符串在内部是字节组成的数组,用花括号访问或修改字符串对多字节字符集很不安全。
C、substr()、strpos()、strlen()、htmlentities()处理字符串时依据的编码方式是相同的。
D、一个布尔值 Boolean 的 true 被转换成 string 的 “ 1”,false 被转换成空字符串。
//substr多字节字符会乱码
2、下列Linux下Shell命令的说法,不正确的是:D
A、crontab作业:“ 0 5,6,7 * *&/home/www/test.sh”意思是每天的第5,6,7小时执行脚本。
B、“ find ./ -type f -name ".php" -print0 | xargs -0 wc -l ”
能统计当前目录下PHP代码的总行数。
C、Shell下执行命令“ :(){:|:& };: ”,系统会没有响应,只能重启了。
D、“ $@ ”将函数中所有参数当成单个字符串,“ $*”把函数的所有参数当一个数组。
//都是取所有参数,前者是存到列表,后者作为一个字符串
3、以下正则表达式的说法,错误的是:C
A、POSIX兼容正则没有修正符,PERL兼容正则中可能用到修正符。
B、{n,},n是一个非负整数,意思是至少匹配n次;?等价于匹配长度{0,1} 。
C、PERL风格正则默认的非贪婪模式尽可能少的匹配所搜索的字符串。
D、在执行效率上 preg_match 比ereg的速度要略快一些。
4、关于PHP数组的说法,不对的是:B
A、处理PHP数组,foreach的效率要比for高很多,是因为foreach走的是链表的遍历。
B、PHP数组底层采用的是循环链表,正向、反向遍历数组都很方便。
C、无论是 array(1, 2, 3) 还是array(1 =& 2,
2=&4)等,本质上都是hash_table。
D、PHP数组插入和删除操作的时间复杂度都是O(1)。
//双向链表
5、有关PHP引用的说法,错误的是: B
A、unset一个引用,只是断开了变量名和变量内容之间的绑定,这并不意味着变量内容被销毁了。
B、PHP引用本质就是指针,在函数调用范围内可以绑定到别的变量上面。
C、在一个对象的方法中,$this永远是调用它的对象的引用。
D、可以将一个变量通过引用传递给函数,这样该函数就可以修改其参数的值。
//引用只是值内存块的别名,而指针是一个实体,存放的值内存地址,需要额外分配内存空间。
6、以下对PHP命名空间的说法,不对的是:B
A、访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或
\INI_ALL。
B、关键字 namespace可用来显式访问当前命名空间或子命名空间中的元素,它等价于类中的 this 操作符。
C、任意合法的PHP代码都可以包含在命名空间中,但只有三种类型的代码受命名空间的影响,它们是:类,函数和常量。
D、常量NAMESPACE的值是当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它就是一个空字符串。
//namespace 是声明命名空间的
7、下列PHP相关的说法,错误的是:D
A、PHP官方推荐使用Apache的prefork模式,此模式下建议选用Non Thread Safe版本。
B、FastCGI下选择Non Thread Safe版本;ISAPI下选择Thread Safe版本。
C、用PHP彩蛋能大致获取PHP的版本, PHP中一共隐藏了4个彩蛋。
D、官方不建议将Non ThreadSafe用于生产环境,所以我们选择Thread Safe版本的PHP来使用。
//fastcgi就需要nts版本
8、关于JavaScript的说法,不正确的是:A
A、语句“ alert(1==true); ” 和语句 “ alert(2==true); ”
的结果都是true。
B、JS的数组其实就是对象,用for...in语句可以遍历数组的所有属性。
C、JS中的对象通过引用来传递,它们永远不会被复制。
D、JS中的函数就是对象,所以它们可以像任何其他的值一样被使用。
//alert(2==true) 是 false
9、有关PHP面向对象的说法,不对的是: C
A、要实现一个接口,使用 implements操作符,类中必须实现接口中定义的所有方法,否则会报一个致命错误。
B、类名可以是任何非 PHP保留字的合法标签,汉字也可以作为PHP的类名。
C、如果PHP的子类中定义了构造函数,则创建子类的对象时,会隐式的调用其父类的构造函数。
D、序列化一个对象将会保存对象的所有变量,但是不会保存对象的方法,只会保存类的名字。
//必须显式调用 parent::__construct();
10、以下PHP高级特性的说法,正确的是:B
A、我们可以定义一个类去实现预定义接口Iterator,然后就能像访问数组一样访问这个类创建的对象。
B、splautoloadregister()提供了一种更加灵活的方式来实现类的自动加载,不再建议使用&autoload()
C、PHP在对象中调用一个不可访问方法时,invoke()方法会被自动调用。
D、匿名函数也叫闭包函数,常用作回调函数参数的值,但是不能作为变量的值来使用。
//A:应该是ArrayAccess C:__call D:匿名函数可以赋值给变量
11、下列关于HTTP协议的说法,错误的是:B
A、如果本地开启了Cookie,那么每打开一个网址,HTTP请求就会把相应的Cookie传给Web服务器。
B、HTTP响应的状态码为301意思是暂时地把内容转移到一个新的URL,但是老的URL还没有废除。
C、HTTP是一个基于请求与响应模式的、无状态的、应用层的协议,绝大多数的Web开发都是基于HTTP协议。
D、绝大多数的Web开发离不开Cookie,如果禁用Cookie导致Session失效,可以通过URL来传递sessionID。
//301表示永久重定向
12、以下对PHP文件处理的说法,正确的是:C&A、filegetcontents()函数能用来抓取网页数据,但是没办法设置超时时间
B、file() 函数既能读取文本文件也能读取二进制文件,但是读取二进制文件有可能出现安全问题。
C、如果表单中没有选择上传的文件,则 PHP 变量 的值将为NULL 。
D、fsockopen()和fputs()结合起来可以发送邮件,也可以用来抓取网页内容,下载ftp文件等。
//A:可以通过context参数设置 B:fputs是写入,只能用于上传
13、关于Mysql索引的说法,不对的是:C
A、500万数据的用户表user在性别字段sex上建立了索引,语句 “select * from user where sex=1 ”
并不会提速多少。
B、一般情况下不鼓励使用like操作,类似的“ like "abc%" ” 可以使用到索引。
C、唯一索引允许空值,而主键索引不允许为空值,除此之外它们是相同的。
D、对于需要写入数据的操作,比如DELETE、UPDATE以及INSERT操作,索引会降低它们的速度。
//primary 不允许空值,unique允许
14、下列有关数据结构的说法,不正确的是:A
A、直接选择、二分法、冒泡、基数等排序方法都是稳定的排序方法。
B、5000个无序的元素,希望用最快的速度挑选出其中前50个最大的元素,最好选用堆排序。
C、栈和队列都只允许在端点处插入和删除元素。
D、深度优先遍历是一个递归算法,在遍历的过程中,先访问的点被压入栈底。
//不稳定:简单选择排序,希尔排序,快速排序,堆排序,冒泡
//稳定:直接插入排序,归并排序,基数排序
15、以下关于NOSQL的说法,不对的是:B
A、MongoDB支持CAP定理中的AP,MySQL支持CAP中的CA,全部都支持不可能存在。
B、Redis支持字符串、哈希、列表、集合、有序集合等数据结构,目前Redis不支持事务。
C、Memcache既支持TCP协议,也支持UDP协议,我们可以把PHP的Session存放到Memcache中。
D、MongoDB不用先创建Collection的结构就可以直接插入数据,目前MongoDB不支持事务。
16、关于设计模式的说法,错误的是:A
A、观察者模式中,观察者可以改变被观察者的状态,再由被观察者通知所有观察者依据被观察者的状态进行。
B、MVC模型的基本工作原理是基于观察者模式,实现是基于命令模式。
C、设计模式的核心原则是:"开-闭"原则:对扩展开放,对修改关闭。
D、创立型模式的根本意图是要把对象的创建和使用分离的责任进行分离,从而降低系统的耦合度。
//不能改变
17、下列关于常见开源PHP系统的说法,不对的是:B
A、Laravel要求PHP版本&=5.3,它拥有更富有表现力的语法、高质量的文档、丰富的扩展包,被称为“巨匠级PHP开发框架”。
B、Discuz采用单一入口的设计模式,这样的模式在权限控制,URL重写等方面都很有优势。
C、HDWiki的插件共有三种类型,钩子类型、前台应用和后台应用类型,在后台可以在线安装HDWiki插件。
D、WordPress的博客程序定位,简单的数据库层等都注定了他不能适应大数据。
//discuz是多入口
18、以下关于“表驱动法”的描述,错误的是:B
A、表驱动法可以作为复杂继承结构的替代方案,难点在于一个经过深思熟虑的查询表。
B、表驱动法是一种编程模式——从数据库表里面查找信息而不使用逻辑语句。
C、凡是能通过逻辑来选择的事物,都可以通过查表来选择。
D、表驱动法查找无规则分布的数据采用阶梯访问的方法最佳。
19、下列关于全文检索技术的说法,不对的是:B
A、Sphinx是一个基于SQL的全文检索引擎,可以结合MySQL做全文搜索,它可以提供比数据库本身更专业的搜索功能。
B、Solr是新一代的全文检索组件,它比Lucene的搜索效率高很多,还能支持HTTP的访问方式,PHP调用Solr也很方便。
C、MySQL中把一个字段建立FULLTEXT索引,就可以实现全文检索,目前MyISAM和InnoDB的table都支持FULLTEXT索引。
D、Lucene附带的二元分词分析器CJKAnalyzer切词速度很快,能满足一般的全文检索需要。
20、以下关于大型网站的说法,正确的是:B
A、大型网站程序异常后,程序员可以依据服务器日志信息定位错误,然后在服务器上用vim修正错误即可。
B、大型网站开发很多细节和小网站有巨大差异,如“浏览次数”,小网站用数据库记录,大型网站常采用NoSQL来存储。
C、大型网站选择开发语言很重要,PHP只适合开发中小型网站,并不适合开发大型网站。
D、虚拟机技术不能用在大型网站上,是因为虚拟机性能较差,而大型网站的访问压力太大,采用后服务器可能会宕机。
以上网友发言只代表其个人观点,不代表新浪网的观点或立场。

我要回帖

更多关于 php7 命名空间 的文章

 

随机推荐