什么是命名空间

发布网友 发布时间:2022-04-28 03:50

我来回答

7个回答

懂视网 时间:2022-04-28 08:12

相关学习推荐:php编程(视频)

一直对PHP的命名空间没有全面的了解,只知道是一种可以避免命名冲突的语法结构或特性,下面是我在PHP官网结合实际操作上,来帮助自己理解namespace;
如果有不对的地方,欢迎大家来纠正,谢谢各位大佬!

来源

命名空间是一种抽象的分层,或者说封装的概念;比如文件系统中,hello.php可以在/www/a/和/www/b/两个目录其下存在,但是不能在一个目录下,有两个相同的hello.php;

其次,www/a/ 下可以直接访问到hello.php,但是在a外面的其他目录中,直接访问hello.php,是出错的,因为系统并不知道要访问的文件就是www/a/hello.php;必须得加上一个指定的路径,绝对,相对路径都行;命名空间就借鉴了这种逻辑概念;

为什么说是逻辑概念?因为文件系统本身也是一种虚拟的,抽象的,实际的磁盘是分为n个block块,是没有直接的这种目录结构概念

解决的问题

  1. 自己写的代码中,与PHP内置(或第三方)的类,函数,常量 之间的命名冲突;
    比如说, 载入一个redis的DB类,但是又自己写了一个mysql的DB类,此时,类名相同,必然产生冲突,此时如果将两个类划分到不同的命名空间中,比如 DB edisconnClass , DBmysqlconnClass,则避免了这种问题
  2. 为很长的名称创建别名,提高代码可读性;
    比如说,一个类名是UserInformationCenter,假如命名空间在 AppController,那么使用时,要写 AppControllerUserInformationCenter ,不利于可读性,因此可以加一个简短的别名,AppControllerUserInformationCenter as UIC;
# 使用示例namespace my
ame; //声明一个命名空间,下面的代码属于这个命名空间内class MyClass {} //实际 : my
ameMyclass{}function myfunction() {} // my
amemyfunction()const MYCONST = 1; // my
ameMYCONST$a = new MyClass; //实例化的类是 my
ameMyclass{}$b = new my
ameMyClass; //object(my
ameMyClass)#2 (0) {}$c = strlen('hi'); //全局空间下,前面省略了 $d = namespaceMYCONST; //namespace关键字获取的就是当前的命名空间名称$e = __NAMESPACE__ . "MYCONST";echo "<pre>";var_dump($a, $b, $c ,$d ,$e);echo constant($e);/*object(my
ameMyClass)#1 (0) {
}
object(my
ameMyClass)#2 (0) {
}
int(2)
int(1)
string(15) "my
ameMYCONST"
1
*/

注意:名为PHP或php的命名空间,以及以这些名字开头的命名空间(例如PHPClasses)被保留用作语言内核使用,而不应该在用户空间的代码中使用。

定义命名空间

虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量。

命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字。

namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }

定义子命名空间

namespace MyProjectSubLevel;const CONNECT_OK = 1; //MyProjectSubLevelCONNECT_OKclass Connection { /* ... */ } //MyProjectSubLevelConnectionfunction connect() { /* ... */ } //MyProjectSubLevelconnect

在同一个文件中定义多个命名空间

  1. 写法1
namespace MyProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }namespace AnotherProject;const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }
  1. 写法2
namespace MyProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}namespace AnotherProject {const CONNECT_OK = 1;class Connection { /* ... */ }function connect() { /* ... */ }}

使用命名空间

  1. 非限定名称,或不包含前缀的类名称,例如 $a=new foo();foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称
  2. 限定名称,或包含前缀的名称,例如 $a = new subnamespacefoo();subnamespacefoo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespacesubnamespacefoo。如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespacefoo
  3. 完全限定名称,或包含了全局前缀操作符的名称,例如, $a = new currentnamespacefoo();currentnamespacefoo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespacefoo

下面是示例:

# file1.php<?phpnamespace FooBarsubnamespace;const FOO = 1;function foo() {}class foo{
 static function staticmethod() {}}?># file2.php<?phpnamespace FooBar;include 'file1.php';const FOO = 2;function foo() {}class foo{
 static function staticmethod() {}}/* 非限定名称 */foo();   // 解析为 function FooBarfoofoo::staticmethod(); // 解析为类 FooBarfoo的静态方法staticmethodecho FOO;   // 解析为 constant FooBarFOO/* 限定名称 */subnamespacefoo();   // 解析为函数 FooBarsubnamespacefoosubnamespacefoo::staticmethod(); // 解析为类 FooBarsubnamespacefoo , 以及类的方法 staticmethodecho subnamespaceFOO;   // 解析为常量 FooBarsubnamespaceFOO/* 完全限定名称 */FooBarfoo();   // 解析为函数 FooBarfooFooBarfoo::staticmethod(); // 解析为类 FooBarfoo, 以及类的方法 staticmethodecho FooBarFOO;   // 解析为常量 FooBarFOO?>

注意访问任意全局类、函数或常量,都可以使用完全限定名称,例如 strlen()ExceptionINI_ALL

<?phpnamespace Foo;function strlen() {}const INI_ALL = 3;class Exception {}$a = strlen('hi');  // 调用全局函数strlen 2$b = INI_ALL;   // 访问全局常量 INI_ALL 7$c = new Exception('error'); // 实例化全局类 Exception?>

命名空间和动态语言特征

example1.php:

<?phpclass classname{
 function __construct()
 {
 echo __METHOD__,"
";
 }}function funcname(){
 echo __FUNCTION__,"
";}const constname = "global";$a = 'classname';$obj = new $a;  // classname::__construct$b = 'funcname';$b();   // funcnameecho constant('constname'), "
"; // global?>
<?phpnamespace namespacename;class classname{
 function __construct()
 {
 echo __METHOD__,"
";
 }}function funcname(){
 echo __FUNCTION__,"
";}const constname = "namespaced";include 'example1.php';$a = 'classname';$obj = new $a;  // classname::__construct$b = 'funcname';$b(); // prints funcnameecho constant('constname'), "
"; // prints global/* note that if using double quotes, "
amespacenameclassname" must be used */$a = '
amespacenameclassname';$obj = new $a; // prints namespacenameclassname::__construct$a = 'namespacenameclassname';$obj = new $a; // also prints namespacenameclassname::__construct$b = 'namespacenamefuncname';$b(); // prints namespacenamefuncname$b = '
amespacenamefuncname';$b(); // also prints namespacenamefuncnameecho constant('
amespacenameconstname'), "
"; // prints namespacedecho constant('namespacenameconstname'), "
"; // also prints namespaced?>

namespace关键字和NAMESPACE常量

PHP支持两种抽象的访问当前命名空间内部元素的方法,__NAMESPACE__ 魔术常量和namespace关键字。

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

常量 __NAMESPACE__ 在动态创建名称时很有用,例如:

<?phpnamespace MyProject;function get($classname){
 $a = __NAMESPACE__ . '' . $classname;
 return new $a;}?>

关键字 namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。

<?phpnamespace MyProject;use blahlah as mine;blahmine();  // MyProjectlahmine()namespacelahmine(); // MyProjectlahmine()namespacefunc();  // MyProjectfunc()namespacesubfunc();  // MyProjectsubfunc()namespacecname::method(); // MyProjectcname::method()$a = new namespacesubcname(); // MyProjectsubcname$b = namespaceCONSTANT;  // MyProjectCONSTANT?>

使用命名空间:别名/导入

为类名称使用别名,为接口使用别名,为命名空间名称使用别名,别名是通过操作符 use 来实现的

想了解更多编程学习,敬请关注php培训栏目!

热心网友 时间:2022-04-28 05:20

namespace即“命名空间”,也称“名称空间” 、”名字空间”。VS.NET中的各种语言使用的一种代码组织的形式 通过名称空间来分类,区别不同的代码功能 同时也是VS.NET中所有类的完全名称的一部分。

通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。使用扩展标记语言的时候,XML的命名空间是所有元素类别和属性的集合。元素类别和属性的名字是可以通过唯一XML命名空间来唯一。

在XML里,任何元素类别或者属性因此分为两部分名字,一个是命名空间里的名字另一个是它的本地名。在XML里,命名空间通常是一个统一资源识别符(URI)的名字。而URI只当名字用。主要目的是为了避免名字的冲突。

扩展资料:

由于namespace的概念,使用C++标准程序库的任何标识符时,可以有三种选择:

1、直接指定标识符。例如std::ostream而不是ostream。完整语句如下: std::cout << std::hex << 3.4 << std::endl;

2、使用using关键字。 using std::cout; using std::endl; using std::cin; 以上程序可以写成 cout << std::hex << 3.4 << endl;

3、最方便的就是使用using namespace std; 例如: using namespace std;这样命名空间std内定义的所有标识符都有效(曝光)。就好像它们被声明为全局变量一样。

参考资料来源:百度百科-namespace

热心网友 时间:2022-04-28 06:38

命名空间一般指namespace,是VS.NET中的各种语言使用的一种代码组织的形式 通过名称空间来分类,区别不同的代码功能 同时也是VS.NET中所有类的完全名称的一部分。

命名空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象。

扩展资料

通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。使用扩展标记语言的时候,XML的命名空间是所有元素类别和属性的集合。元素类别和属性的名字是可以通过唯一XML命名空间来唯一。

在XML里,任何元素类别或者属性因此分为两部分名字,一个是命名空间里的名字另一个是它的本地名。在XML里,命名空间通常是一个统一资源识别符(URI)的名字。而URI只当名字用。主要目的是为了避免名字的冲突。

参考资料来源:百度百科-namespace

热心网友 时间:2022-04-28 08:12

namespace即“命名空间”,也称“名称空间” 、”名字空间”。VS.NET中的各种语言使用的一种代码组织的形式 通过名称空间来分类,区别不同的代码功能 同时也是VS.NET中所有类的完全名称的一部分。

命名空间是用来组织和重用代码的。如同名字一样的意思,NameSpace(名字空间),之所以出来这样一个东西,是因为人类可用的单词数太少,并且不同的人写的程序不可能所有的变量都没有重名现象。

对于库来说,这个问题尤其严重,如果两个人写的库文件中出现同名的变量或函数(不可避免),使用起来就有问题了。为了解决这个问题,引入了名字空间这个概念,通过使用 namespace xxx;你所使用的库函数或变量就是在该名字空间中定义的,这样一来就不会引起不必要的冲突了。

通常来说,命名空间是唯一识别的一套名字,这样当对象来自不同的地方但是名字相同的时候就不会含糊不清了。使用扩展标记语言的时候,XML的命名空间是所有元素类别和属性的集合。元素类别和属性的名字是可以通过唯一XML命名空间来唯一。

扩展资料:

命名空间使用

命名空间中的类名可以通过三种方式引用:

1、非限定名称,或不包含前缀的类名称

例如 $a=new foo(); 或 foo::staticmethod();。如果当前命名空间是 currentnamespace,foo 将被解析为 currentnamespace\foo。

如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,则 foo 会被解析为foo。 警告:如果命名空间中的函数或常量未定义,则该非限定的函数名称或常量名称会被解析为全局函数名称或常量名称。

2、限定名称,或包含前缀的名称

例如 $a = new subnamespace\foo(); 或subnamespace\foo::staticmethod();。如果当前的命名空间是 currentnamespace,则 foo 会被解析为 currentnamespace\subnamespace\foo。

如果使用 foo 的代码是全局的,不包含在任何命名空间中的代码,foo 会被解析为subnamespace\foo。

3、完全限定名称,或包含了全局前缀操作符的名称

例如, $a = new \currentnamespace\foo(); 或 \currentnamespace\foo::staticmethod();。在这种情况下,foo 总是被解析为代码中的文字名(literal name)currentnamespace\foo。

参考资料来源:百度百科-namespace

热心网友 时间:2022-04-28 10:04

命名空间即namespace,也称名称空间、名字空间。命名空间是用来组织和重用代码的,区别不同的代码功能。用来储存变量名和对象绑定关系的一个区域,在 Python 中用字典来储存。通常来说,命名空间是唯一识别的一套名字。

可以认为namespaces是你kubernetes集群中的虚拟化集群,在一个Kubernetes集群中可以拥有多个命名空间,它们在逻辑上彼此隔离。对一个对象的读写操作,实际上就是在改变这个对象所处的命名空间的值,当然这是对命名空间而言,对象的读写底层还是内存操作。

扩展资料

命名空间有两个作用,其一是取值,其二为赋值。

取值的时候,Python 解释器会从当前的命名空间开始搜索,也就是 locals 命名空间,如果找不到就搜索其他的命名空间。当查到到了以后,就停止搜索,并把变量加入到当前的命名空间,如果最终没有搜索到,那么就会抛出 NameError异常。

变量的赋值,会是修改当前所处命名空间中对应的键值对,如果当前命名空间中没有这个键值对,那么就会重新新建一个键值对,如果外层的命名空间存在这个键值对,还是会在当前命名空间新键一个键值对,而且两个命名空间互不影响。

参考资料来源;百度百科--namespace



热心网友 时间:2022-04-28 12:12

命名空间是为了把一些类和类的实例更好地管理而定义的把这些类和实体集合起来的一个团体,它是_Namespace system class的一个实例,或者是_Namespace类的一个派生类,_Namespace类只有一个属性:Name。通过这个属性用户可以把某个命名空间和其他的命名空间分开来,注意命名空间的Name不能包括头缀和后缀的下划线。
命名空间可以相互联系和组织成一个具有任意层次的由类和类的实例组成的网状结构,这种结构有点象文件系统的树状结构,在同一个层次的情况下,命名空间必须具有互异的名称。
为了表示它们的层次结构你可以用右下线表示这种关系,如下:
Namespace1\Namespace2\Namespace3.....\LastNamespace
虽然说这些命名空间可以表示成这样的层次结构,但是,这些命名空间之间没有类的继承关系,也就是说,子的命名空间中的类不会自动继承父的命名空间中的类。
通常情况下,一个命名空间包含了在某种环境下一系列的类和类的实例。例如那些在Win32下定义和运行的类即使是和其他的命名空间里的类具有相同的名字也不会出现冲突,然而在建立一个新的类的时候,最好还是不要和已经建立的类的名字相同,这为将来WMI发布减少了一些问题。

热心网友 时间:2022-04-28 14:36

命名空间(英语:Namespace)表示标识符(identifier)的上下文(context)。一个标识符可在多个命名空间中定义,它在不同命名空间中的含义是互不相干的。这样,在一个新的命名空间中可定义任何标识符,它们不会与任何已有的标识符发生冲突,因为已有的定义都处于其它命名空间中。
例如,设Bill是X公司的员工,工号为123,而John是Y公司的员工,工号也是123。由于两人在不同的公司工作,可以使用相同的工号来标识而不会造成混乱,这里每个公司就表示一个的命名空间。如果两人在同一家公司工作,其工号就不能相同了,否则在支付工资时便会发生混乱。
这一特点是使用命名空间的主要理由。在大型的计算机程序或文档中,往往会出现数百或数千个标识符。命名空间(或类似的方法,见“命名空间的模拟”一节)提供一隐藏区域标识符的机制。通过将逻辑上相关的标识符组织成相应的命名空间,可使整个系统更加模块化。

声明声明:本网页内容为用户发布,旨在传播知识,不代表本网认同其观点,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。E-MAIL:11247931@qq.com