PHP手册学习日记-命名空间

学习内容来自PHP官网手册 : PHP 手册》 语言参考》 命名空间

简单理解

  • 文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念

解决的问题

  1. 用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突
  2. 为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性

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

定义命名空间

  • 注意:虽然任意合法的PHP代码都可以包含在命名空间中,但只有以下类型的代码受命名空间的影响,它们是:类(包括抽象类和traits)、接口、函数和常量
  • 注意:命名空间通过关键字namespace 来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间,除了一个以外:declare关键字
  • 声明单个命名空间
<?php
namespace MyProject;

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

$obj = new Connection();
var_dump($obj);	//object(MyProject\Connection)#1 (0) { }
  • 声明分层次的单个命名空间
<?php
namespace MyProject\Sub\Level;

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

$obj = new Connection();
var_dump($obj);		//object(MyProject\Sub\Level\Connection)#1 (0) { }
  • 在同一个文件中定义多个命名空间
# 方式1
<?php
namespace MyProject;

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

$obj1 = new Connection();

namespace AnotherProject;

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


$obj2 = new Connection();

var_dump($obj1,$obj2);	//object(MyProject\Connection)#1 (0) { } object(AnotherProject\Connection)#2 (0) { }


# 方式2
<?php
namespace MyProject {

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

	$obj = new Connection();

	var_dump($obj);
}

namespace AnotherProject {

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

	$obj = new Connection();

	var_dump($obj);

}

namespace{
	var_dump($obj);
}
?>

使用命名空间

posted @ 2020-08-31 17:33  junwind  阅读(67)  评论(0)    收藏  举报