命名空间概念:
具体举个例子就明白了,在windows系统中文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。对比于程序中,一样的概念,同一个脚本中,出现同样的类名,常量名,函数名等,会报致命错误,命名空间解决了这一问题。
当然,我们可以在编写代码时,避免出现重名的问题,但是当使用第三方插件时,则很可能遇到,所以在项目初期还是要规划好命名空间。
命名空间用来解决的问题:
1、用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
2、为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
注意事项:
1、只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口(interface)、函数和常量。
2、在声明命名空间之前唯一合法的代码是用于定义源文件编码方式的 declare 语句。另外,所有非 PHP 代码包括空白符都不能出现在命名空间的声明之前。
3、访问任意全局类、函数或常量,都可以使用完全限定名称,例如 \strlen() 或 \Exception 或 \INI_ALL。这样可以避免与当前执行脚本方法区分开来。

一、使用命名空间
1、同一个文件中并不提倡使用定义多个命名空间,这里不做介绍,了解可查看官网,http://php.net/manual/zh/language.namespaces.definitionmultiple.php
2、使用命名空间:基础
类名可以通过三种方式引用:

方式 描述 不包含命名空间PHP解析 包含命名空间PHP解析
非限定名称 不包含前缀的名称eg: $a=new foo(); 或 foo::test(); foo 会被解析为foo 如果当前命名空间是 Search,foo 将被解析为 Search\foo, 如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称
限定名称 包含前缀的名称eg:$a = new user\foo(); 或 user\foo::test(); foo 会被解析为user\foo 如果当前的命名空间是 Search,则 foo 会被解析为 Search\user\foo
完全限定名称 包含了全局前缀操作符的名称eg:$a = new \user\foo(); 或 \user\foo::test(); foo 总是被解析为user\foo foo 总是被解析为user\foo

eg:
file1.php文件

<?php
namespace Foo\Bar\subnamespace;
const FOO = 1;
function foo() {}
class foo
{static function staticmethod() {}
}

file2.php文件

<?php
namespace Foo\Bar;
include 'file1.php';const FOO = 2;
function foo() {}
class foo
{static function staticmethod() {}
}/* 非限定名称 */
foo(); // 解析为 Foo\Bar\foo
foo::staticmethod(); // 解析为类 Foo\Bar\foo的静态方法staticmethod。
echo FOO; // 解析为 Foo\Bar\FOO/* 限定名称 */
subnamespace\foo(); // 解析为函数 Foo\Bar\subnamespace\foo
subnamespace\foo::staticmethod(); // 解析为类 Foo\Bar\subnamespace\foo,// 以及类的方法 staticmethod
echo subnamespace\FOO; // 解析为常量 Foo\Bar\subnamespace\FOO/* 完全限定名称 */
\Foo\Bar\foo(); // 解析为函数 Foo\Bar\foo
\Foo\Bar\foo::staticmethod(); // 解析为类 Foo\Bar\foo, 以及类的方法 staticmethod
echo \Foo\Bar\FOO; // 解析为常量 Foo\Bar\FOO

3、__NAMESPACE__
常量__NAMESPACE__的值是包含当前命名空间名称的字符串。在全局的,不包括在任何命名空间中的代码,它包含一个空的字符串。

二、命名空间和动态语言特征
所谓命名空间的动态,就是一个变量接收路径,例如$a = '\namespacename\classname';
动态的类名称、函数名称或常量名称中,限定名称和完全限定名称没有区别,全部被解析成完全限定名称,因此其前导的反斜杠是不必要的。
eg:
文件1.php

<?php
class classname
{function __construct(){echo __METHOD__,"\n";}
}
function funcname()
{echo __FUNCTION__,"\n";
}
const constname = "global";$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global

文件2.php

<?php
namespace namespacename;
class classname
{function __construct(){echo __METHOD__,"\n";}
}
function funcname()
{echo __FUNCTION__,"\n";
}
const constname = "namespaced";include '1.php';$a = 'classname';
$obj = new $a; // prints classname::__construct
$b = 'funcname';
$b(); // prints funcname
echo constant('constname'), "\n"; // prints global$a = '\namespacename\classname';
$obj = new $a; // prints namespacename\classname::__construct
$a = 'namespacename\classname';
$obj = new $a; // also prints namespacename\classname::__construct
$b = 'namespacename\funcname';
$b(); // prints namespacename\funcname
$b = '\namespacename\funcname';
$b(); // also prints namespacename\funcname
echo constant('\namespacename\constname'), "\n"; // prints namespaced
echo constant('namespacename\constname'), "\n"; // also prints namespaced

三、使用命名空间:别名/导入
这里的导入/别名指的是导入/别名"命名空间",三种别名或导入方式:
1、为类名称使用别名
2、为接口使用别名
3、为命名空间名称使用别名。
注意事项:
1、PHP 5.6开始允许导入函数或常量或者为它们设置别名。
2、前导的反斜杠是不必要的也不推荐的,因为导入的名称必须是完全限定的,不会根据当前的命名空间作相对解析。
导入用use ...,导入+别名用 use ... as

eg:
test1.php文件

<?php
namespace Demo2;
require('test2.php');
use Demo1;
use function Demo1\test as test1;
function test(){echo 5;
}
class test{function test(){echo 4;}
}
test1();//输出1
echo '<hr>';
echo namespace\test();//输出5
echo '<hr>';
$test = new Demo1\test();//输出2

test2.php文件

<?php
namespace Demo1;
function test(){echo 1;
}
class test{function __construct(){echo 2;}public function test(){echo 3;}
}

3.7、PHP命名空间相关推荐

  1. OpenCV 笔记(04)— OpenCV2 升级到 OpenCV3/CV4 的改动(去掉 CV_前缀、使用新的前缀替换、使用新的命名空间宏)

    1. 由于宏名称的变更照成的"未声明的标识符"系列问题 有时候,遇到此类问题加入一句 #include <cv.h> 便可以让 OpenCV3 或者 OpenCV4 也 ...

  2. 解读Python的命名空间

    前面我们理解了变量.函数的作用域,现在我们再深入讨论一下Python是如何给变量.函数划分作用域的. 我们在编写Python程序的过程中,如果要使用变量和函数,都需要先对变量和函数命名后才能使用.Py ...

  3. C++ 笔记(03)— 命名空间(概念、定义、调用、using name 指令、嵌套命名空间)

    1. 命名空间概念 在 C++ 应用程序中, 您可能会写一个名为 func() 的函数,在另一个可用的库中也存在一个相同的函数 func() .这样,编译器就无法判断您所使用的是哪一个 func() ...

  4. C++ 笔记(02)— 程序结构(头文件说明、命名空间、函数返回值、函数参数、注释、语句结束符、cin/cout)

    先看以下代码 #include <iostream> #include <string> using namespace std;int main() // main() 是程 ...

  5. c++标准库 及 命名空间std

    1.命名空间std C++标准中引入命名空间的概念,是为了解决不同模块或者函数库中相同标识符冲突的问题.有了命名空间的概念,标识符就被限制在特定的范围(函数)内,不会引起命名冲突.最典型的例子就是st ...

  6. 不同命名空间的对象二进制反序列化问题

    本质上说,这并不是二进制序列化的问题,甚至不关序列化的问题. 你想要的是在两个内部结构一致但在不同命名空间(甚至不同项目)的同名类间做类型转换. 这个问题很常见,因为实际工作中经常会有此类需求,但是我 ...

  7. 关于命名空间namespace

    虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits).接口.函数和常量. 在声明命名空间之前唯一合法的代码是用于定义源文件编码方 ...

  8. .NET 框架中的 WMI 命名空间

    .NET 框架中的 WMI 命名空间   .NET框架中与WMI规范有关的命名空间有两个,分别是System.Management和System.Management.Instrumentation两 ...

  9. Namespace(命名空间)的使用

    作者:飞刀 关于Namespace(命名空间)的使用常用<% @ Import Namespace="System.Data" %>,这是在引用M$为我们提供的Name ...

  10. 【C++】C++命名空间重定向

    参见博客: namespace使用总结 命名空间的重定向的格式: namespace newName = oldName; 在caffe源码走读时,遇到namespace的重定向用法,以前没有用过,源 ...

最新文章

  1. MIT提出Liquid机器学习系统,可像液体一样适应动态变化
  2. php验证旧密码,PHP验证数据库密码问题
  3. MySQL 中 delete 语句的子查询限制
  4. Web前端开发笔记——第四章 JavaScript程序设计 第五节 数组
  5. firebird 行级锁问题_MySQL 锁
  6. oracle rowID切片,Oracle中的rowid
  7. SpriteKit在复制节点时留了一个巨坑给开发者,需要开发者手动把复制节点的isPaused设置为false...
  8. LeetCode-二叉树算法总结-层次遍历,路径总和等
  9. 【Day 1】机器阅读理解——机器阅读理解简介
  10. windows批量上传文件到linux,windows上传文件到linux云服务器上
  11. 虚拟化:侧信道攻击案例
  12. 51单片机温控风扇仿真原理图 C语言程序,51单片机智能温控风扇程序
  13. windows10视频缩略图不显示怎么办?
  14. 数据中心优化专家Future Facilities公司推出6Sigma DCX最新版本
  15. clip gradient
  16. jQuery+Ajax+全解析
  17. 2021年焊工(初级)考试资料及焊工(初级)复审考试
  18. 王的机器第一本书「快乐机器学习」飨你
  19. 怎么计算机械加工产能,生产计划人员如何计算一个工厂生产产能?..doc
  20. 免费开源的商城系统!可商用!推荐给你

热门文章

  1. 解决git:fatal:Unable to create”…/.git/index.lock” 的错误
  2. sql服务器字段顺序怎么修改,你可能不知道SQL Server索引列的升序和降序带来的性能问题...
  3. 紫书习题3-6纵横字谜的游戏
  4. 计算机共享打印怎么设置密码,共享打印机需要密码的解决方法
  5. php ecshop 清除缓存文件夹,ecshop缓存常见问题
  6. 7月18日云栖精选夜读丨蚂蚁金服的“野心”:要做新一代世界级金融科技供应商...
  7. shell编写三角函数_VB中三角函数计算.doc
  8. 豆瓣高分电影信息分析(数据分析)
  9. 在有C语言的基础上,快速学习python(C语言转战python)(python3)
  10. java json字符串转化为list