PHP 命名空间小结
2014-06-07 22:24
381 查看
命名空间主要目的就是解决重名问题,由于在PHP里,函数重载是不允许的,所以在这种情况下要避免重名,最常见的做法就是约定好命名,比如用前缀,使用当前文件路径。但是这种做法就使代码量增多了。当项目逐渐变大的时候,如果规划不好还是有可能出现重名的错误。所以这时候命名空间是一个很好的解决办法
###基础###
*注意的是在脚本里首次出现的命名空间前面不能出现任何代码,连空格都不行,否则会报错
为什么说首次出现呢?因为在同一个脚本里可以使用多个命名空间,他们不能直接简单的调用,需要使用命名空间的语法:
可以看到在调用Article空间里的Comment类的时候使用了类似文件路径的语法:
除了类以外,函数和常量的用法也是一样的:
###子命名空间###
命名空间可以有自己的子空间,例如
比如上面的
###公共空间###
先举个这样的一个例子,这里有一个要被包含的脚本(common_inc.php),并且脚本里没有声明命名空间:
然后在另一个含有命名空间的脚本里包含这个文件时,其实这里的类和函数不属于当前空间的:
调用公共空间的属性 只需要在前面加一个
###名称术语###
在说空间导入之前,先说几个术语概念,方便今后统一说明:
非限定名称 (不包含前缀的类名称)
限定名称(不包含前缀的类名称)
完全限定名称(包含了全局前缀的类名称)
把他们想像成文件路径更好理解:
非限定名称: comment.php
限定名称: /article/comment.php
完全限定名称: /blog/article/comment.php
###别名和导入###
别名和导入可以当作一种调用命名空间的快捷方式。PHP 不支持导入函数和常量
别名可以用
<!--lang:php-->
use Blog\Article as Article;
use Blog\Article // 效果同上 等于 use Blog\Article as Article;
$article = new Article\Comment();
###字符串调用问题###
使用双引号注意特殊字符转义问题
<!--lang:php-->
namespace Blog\Article;
Class name {}
$class_name = NAMESPACE."\name"; // 但是\n 将被转义成换行符
字符串形式调用永远不会认为是限定名称
PHP 在编译脚本的时候就已经确认了元素所在的命名空间,以及导入的情况。而在解析脚本时,字符串的形式调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称
###基础###
<!--lang:php--> // 创建一个名为Article的命名空间 <?php namespace Article;
*注意的是在脚本里首次出现的命名空间前面不能出现任何代码,连空格都不行,否则会报错
为什么说首次出现呢?因为在同一个脚本里可以使用多个命名空间,他们不能直接简单的调用,需要使用命名空间的语法:
<!--lang:php--> <?php namespace Article; Class Comment {} namespace MessageBoard; Class Comment {} $comment = new Comment(); // 如果什么都不写,这是默认调用当前空间(MessageBoard)的Comment类 // 下面是调用Article 类的Comment类 $comment = new \Article\Comment();
可以看到在调用Article空间里的Comment类的时候使用了类似文件路径的语法:
空间名\元素名
除了类以外,函数和常量的用法也是一样的:
<!--lang:php--> namespace Article; const PATH = '/abc/dir'; function getComment() { return 100; } Class Comment {} namespace MessageBoard; const PATH = '/messageboard'; function getComment() { return 300; } Class Comment{} // 调用当前空间(MessageBoard)的常量,函数和类 echo PATH; // messageboard; echo getComment(); // 300 $comment = new Comment(); // 调用Article 空间的常量,函数和类 echo \Article\PATH; // /abc/dir echo \Article\getComment(); // 100 $comment = new \Article\Comment();
###子命名空间###
命名空间可以有自己的子空间,例如
Blog\Article,在博客空间内有个文章空间。空间可以有很多的层次。
比如上面的
Article都属于
Blog空间的。
<!--lang:php--> namespace Blog\Article; Class Comment {} namespace Blog\Messageboard; Class Comment {} // 调用当前空间的类 $comment = new Comment(); // 调用 Blog\Article 空间的类 $comment = new \Blog\Article\Comment();
###公共空间###
先举个这样的一个例子,这里有一个要被包含的脚本(common_inc.php),并且脚本里没有声明命名空间:
<!--lang:php--> <?php function getIP() {} Class FilterXSS {}
然后在另一个含有命名空间的脚本里包含这个文件时,其实这里的类和函数不属于当前空间的:
<!--lang:php--> namespace Blog\Article; include './common_inc.php'; $filter_xss = new FilterXSS(); // 这样会报错: 找不到 Blog\Article\FilterXSS类 $filter_xss = new \FilterXSS(); // 这是正确写法
调用公共空间的属性 只需要在前面加一个
\就行了,否则PHP 会解析成当前命名空间下的东西,除了自定义的元素,PHP自带的元素都属于公共空间
###名称术语###
在说空间导入之前,先说几个术语概念,方便今后统一说明:
非限定名称 (不包含前缀的类名称)
$comment = new Comment()这种的。如果当前命名空间是
Blog\Article则其实解析成
Blog\Article\Comment
限定名称(不包含前缀的类名称)
$comment = new Article\Comment这种的。如果当前命名空间是
Blog则其实解析成
Blog\Article\Comment
完全限定名称(包含了全局前缀的类名称)
$comment = new \Artilce\Comment这种的。 这种情况下 总是被解析成
Article\Comment
把他们想像成文件路径更好理解:
非限定名称: comment.php
限定名称: /article/comment.php
完全限定名称: /blog/article/comment.php
###别名和导入###
别名和导入可以当作一种调用命名空间的快捷方式。PHP 不支持导入函数和常量
别名可以用
as关键字来设定:
<!--lang:php-->
use Blog\Article as Article;
use Blog\Article // 效果同上 等于 use Blog\Article as Article;
$article = new Article\Comment();
###字符串调用问题###
使用双引号注意特殊字符转义问题
<!--lang:php-->
namespace Blog\Article;
Class name {}
$class_name = NAMESPACE."\name"; // 但是\n 将被转义成换行符
字符串形式调用永远不会认为是限定名称
PHP 在编译脚本的时候就已经确认了元素所在的命名空间,以及导入的情况。而在解析脚本时,字符串的形式调用只能认为是非限定名称和完全限定名称,而永远不可能是限定名称
<!--lang:php--> namespace Blog; use Blog\Article\Common; $common = new Article\Common(); // 限定名称, 解析为 Blog\Article\Common $namespace = 'Article'; $common = new $namespace.'\\'.Common(); // 使用字符串的话 就解析成了 完全限定名称, Article\Common.然而没有这个命名空间 所以报错 namespace Blog\Article; Class Common {}
相关文章推荐
- PHP命名空间namespace使用小结
- Php命名空间语法小结
- PHP自动加载autoload和命名空间的应用小结
- PHP 命名空间解析规则
- [轉]PHP命名空间规则解析及高级功能
- 分析器错误信息: 未能加载类型"命名空间.类"... ---小结
- PHP解析XML命名空间的3种方式(未完)
- PHP 5.3新特性命名空间规则解析及高级功能
- 分析器错误信息: 未能加载类型"命名空间.类"... ---小结
- PHP内核探索:命名空间
- 命名空间 小结
- PHP手册-命名空间
- 分析器错误信息: 未能加载类型"命名空间.类"... ---小结
- PHP手册-命名空间
- PHP手册-__NAMESPACE__关键字(命名空间中继承其他命名空间中类注意)
- PHP命名空间
- PHP5.3新特性之命名空间
- php5.3新特性(一) -- 命名空间
- PHP中实现工厂类模式遭遇命名空间无法正确创建相应的解决代码
- php命名空间使用教程