php命名空间

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。

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

命名空间语法示例

<?php
namespace my\name// 参考 "定义命名空间" 小节

class MyClass {}
function 
myfunction() {}
const 
MYCONST 1;

$a = new MyClass;
$c = new \my\name\MyClass// 参考 "全局空间" 小节

$a strlen('hi'); // 参考 "使用命名空间:后备全局函数/常量" 小节

$d = namespace\MYCONST// 参考 "namespace操作符和__NAMESPACE__常量” 小节

$d __NAMESPACE__ '\MYCONST';
echo 
constant($d); // 参考 "命名空间和动态语言特征" 小节
?>

Note:

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


main.class.php

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. namespace App\main;  
  2. class aa {  
  3.     public static function test() {  
  4.         echo 1;  
  5.     }  
  6. }  
test.class.php
[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. namespace App\test;  
  2. class aa {  
  3.     public static function test() {  
  4.         echo 2;  
  5.     }  
  6. }  

[html]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. require 'main.class.php';  
  3. require 'test.class.php';  
  4. App\main\aa::test();  
  5. App\test\aa::test();  

2、个类名都是aa ,当在一个文件里调用的时候,通过命名空间,就不会报错。

定义子命名空间

(PHP 5 >= 5.3.0, PHP 7)

与目录和文件的关系很象,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:

Example #1 声明分层次的单个命名空间

<?php
namespace MyProject\Sub\Level;

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

?>

上面的例子创建了常量MyProject\Sub\Level\CONNECT_OK类 MyProject\Sub\Level\Connection函数 MyProject\Sub\Level\connect

2.命名空间的三种访问方式

1)非限定名称访问

访问的元素前面不包含前缀,即访问当前定义的元素。

2)限定名称访问

访问的元素包含前缀名称,简单理解使用虚拟目录的相对路径访问方式

3)完全限定名称访问

访问的元素包含全局的命名空间前缀,理解为使用虚拟目录的绝对路径访问

举例说明:

[php]  view plain  copy
  1. <?php  
  2. namespace app1\pro1\item1; //命名空间前不能有有效代码  
  3. header("content-type:text/html;charset=utf-8");  
  4. function func(){  
  5.     echo "func1";  
  6. }  
  7. const x = "name1";  
  8. class Fruit{  
  9.     public $a = '苹果1';  
  10.     static $b = '菠萝1';  
  11. }  
  12.   
  13. namespace app2\pro2\item2\topic2;  
  14. function func(){  
  15.     echo "func2";  
  16. }  
  17. const x = "name2";  
  18. class Fruit{  
  19.     public $a = '苹果2';  
  20.     static $b = '菠萝2';  
  21. }  
  22.   
  23. namespace app2\pro2;  
  24. function func(){  
  25.     echo "func3";  
  26. }  
  27. const x = "name3";  
  28. class Fruit{  
  29.     public $a = '苹果3';  
  30.     static $b = '菠萝3';  
  31. }  
  32. // 非限定名称访问,访问当前定义的元素  
  33. func(); //输出“func3”  
  34. echo x; //name3  
  35. $fruit = new Fruit;//实例化类  
  36. echo $fruit->a; //苹果3  
  37. echo Fruit::$b//菠萝3  
  38.   
  39. // 限定名称访问,访问当前定义元素下面的item2\topic2路径下的元素  
  40. item2\topic2\func(); //输出“func2”  
  41. echo item2\topic2\x; //name2  
  42. $fruit = new item2\topic2\Fruit;//实例化类  
  43. echo $fruit->a; //苹果2  
  44. echo item2\topic2\Fruit::$b//菠萝2  
  45.   
  46. //完全限定名称访问  
  47. \app1\pro1\item1\func(); //输出“fun1”  
  48. echo \app1\pro1\item1\x; //name1  
  49. $fruit = new \app1\pro1\item1\Fruit;//实例化类  
  50. echo $fruit->a; //苹果1  
  51. echo \app1\pro1\item1\Fruit::$b//菠萝1  

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值