您的位置:首页 > 编程语言 > PHP开发

php命名空间

2017-02-04 15:55 204 查看
学习自
命名空间, 来解决重命名的问题
php不允许两个函数或者类出现相同的名称, 否则会出现致命的错误.
加入不使用命名空间, 最常见的做法就是添加前缀,
加入两个模块,article和money,两者都有一个show类, 为了避免重命名. 分别命名为article_show和money_show
这样解决重命名当然是可以的,但是如果, 添加更多的功能的时候,会造成,名称过长.

ps :
1 PHP5.3开始const关键字可以用在;类的外部
2 const和define都可以声明变量,但是在命名空间里,define声明的是全局变量, const声明的是变量只能作用于当前命名空间

1 namespace之前不能有任何代码
2 同一个脚本文件可以创建多个命名空间

namespace Article;
class show{} //当前show属于Article命名空间
namespace Money;
class show{} //当前show属于Money命名空间


  

3 在不同命名空间之间不能直接调用其他元素(类,变量常量)

namespace Article;
class show{} //当前show属于Article命名空间
namespace Money;
class show{} //当前show属于Money命名空间$show = new show();//实例化当前空间Money里面的show类
$show = new \Article\show();//实例化Article里面的show类


  

ps: 调用其他命名空间里面的元素, 语法类似于文件路径 : \空间名称\元素名称

4 子命名空间

namespace Blog\Aritcle;
class show{}
namespace Blog\Money;
class show{}
$show = new show();//实例化Blog\Money空间里面的show类
$show = new \Blog\Article\show();//实例化Blog\Article\空间里面的类


  

5 公共空间
一个公共的脚本common.php

function hello(){}
class world{}


  

在另一个脚本里面调用

namespace Article;
include 'common.php';
$cl = new world();//出现致命的错误. 因为在当前Article空间内没有world方法
$cl = new \world();.//添加\之后,定义到公共空间之内


  

ps: 公共空间的 常量和函数hello不加\也可以正常调用的,但是为了正确区分元素的空间,还是建议调用函数的时候加上\

官网术语
1 非限定名称, 或不包含前缀的类名称 ,$object = new show();如果当期空间是Article,则调用的是Article空间里面的show类, 如果当前语句不在任何命名空间的代码内,则实例化的就是 show类
2 限定名称, 或包含前缀的类名称, $obj = new Article\show();如果当前空间是Blog,则实例化的是Blog\Article的show类, 如果当前语句不在任何命名空间的代码内,则实例化的就是show类
3 完全限定名称, 或包含了全局前缀操作符(\), $object = new \Article\show(),这实例化的是Article下面的show;
ps: 上面三种类似于文件路径的: 文件名, 相对路径, 绝对路径

6 别名和导入命名空间元素

namespace Blog\Article;
class show{}
namespace Blog\Money;
class show{}
use Blog\Article;导入一个命名空间
$show = new Aricle\show();
use Blog\Article\show;//导入一个类
$show = new show();//使用非限定名称的方法来调用元素
use Blog\Article as art;//导入一个命名空间,并使用别名
$show = new art\show();//使用别名代替空间名
use Blog\Article\show as shw;//导入一个雷,并使用别名
$show = new shw();//使用别名代替类名


  

ps: 在导入元素的时候,如果当前空间有相同名称的元素, 会发生致命错误

7 动态调用

namespace Blog\Article;
const path = 'Blog/article';
class show{}

echo namespace\path;//'Blog/article'  namespace表示当前命名空间
$show = new namespace\show();
echo __NAMESPACE__; //__NAMESPACE__表示当前空间名称
$class_name = __NAMESPACE__.'\show';
$show = new $class_name();


  

8 字符串调用形式的问题
使用双引号,会导致特殊字符呗引用

namespace Blog\Article;
class name{}
$class_name  = __NAMESPACE__."\name";//\n被转义
$name = new $classname();//发生致命错误


  

不会认为是限定名称, php在编译脚本的时候,就已经确定元素所在的空间和导入的情况, 而在解析脚本时字符串形式的调用只能认为是非限定调用和完全限定调用, 而永远不能是限定调用

namespace Blog;
use Blog\Article\Common;
//想使用字符串调用的方式来非限定调用Blog\Article\Common;
$class_name = 'Common';
$common = new $class_name();//当前空间Blog没有Common,发生致命错误
//想使用字符串调用的方式来限定调用Blog\Article\Common
$class_name = 'Article\Common';
$common = new $class_name();//实际被当做完全限定,Article下面没有Common,发生致命错误

namespace Blog\Article;
class common{}


  

ps: 命名空间很强大, 但是当项目发展到一定程度, 开发的成本也会上去, 需要好好规划命名规范.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: