1.为啥需要命名空间
解决命名冲突问题。比如自己定义了一个类A,第三方也有一个类A,就可以对自己在类设置一个命名空间,MYCLASS,这样,访问自己在类时候,就MYCLASSA这样访问,就不会冲突。
2 命名空间应用
lib1 and lib2是需要导入的类库
<?php // application library 1 namespace Applib1; const MYCONST = 'AppLib1MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } ?>
<?php // application library 1 namespace Applib2; const MYCONST = 'AppLib2MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } ?>
<?php //app1.php //一个全局空间 const MYCONST = 'MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } echo MYCONST.'<br>'; echo MyFunction().'<br>'; echo MyClass::WhoAmI(); /* MYCONST MyFunction MyClass::WhoAmI */ //总结:在没有别的命名空间下,命名空间是全局 ?>
<?php //app2.php //一个命名空间 namespace AppLib1; const MYCONST = 'AppLib1MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } echo MYCONST.'<br>'; echo MyFunction().'<br>'; echo MyClass::WhoAmI(); /* AppLib1MYCONST AppLib1MyFunction AppLib1MyClass::WhoAmI */ /* 总结: 在最开始定义命名空间之后,文件就只有一个命名空间,所有常量,类都属于这个空间 */ ?>
<?php //app3.php //一个全局+一个命名 require "lib1.php"; const MYCONST = 'MYCONST'; function MyFunction() { return __FUNCTION__; } class MyClass { static function WhoAmI() { return __METHOD__; } } //1全局空间 echo MYCONST.'<br>'; echo MyFunction().'<br>'; echo MyClass::WhoAmI(); /* MYCONST MyFunction MyClass::WhoAmI */ //2手动设置全称命名空间来调用对应元素 echo APPlib1MYCONST.'<br>'; echo APPlib1MyFunction().'<br>'; echo APPlib1MyClass::WhoAmI(); /* AppLib1MYCONST AppLib1MyFunction AppLib1MyClass::WhoAmI */ //使用use去调用对应元素 use APPlib1; echo lib1MYCONST.'<br>'; echo lib1MyFunction().'<br>'; echo lib1MyClass::WhoAmI(); /* AppLib1MYCONST Applib1MyFunction Applib1MyClass::WhoAmI */ /* 总结: 1.没有使用命名空间时候,默认全局空间 2.使用全称或者use空间+半称都可以找到命名空间下面在元素 */ ?>
<?php //app4.php //use 别名 require "lib1.php"; require "lib2.php"; use APPlib1 as l1; use APPlib2 as l2; echo l1MYCONST; echo l2MYCONST; //AppLib1MYCONST //AppLib2MYCONST /* 总结: 使用use的别名功能 */ ?>
<?php //app5.php //use 类 require "lib1.php"; use APPlib1MyClass; echo MyClass::WhoAmI(); //Applib1MyClass::WhoAmI /* 总结: 使用use直接使用类 */ ?>
reference:
http://www.cnblogs.com/kuyuecs/p/3556421.html
https://www.sitepoint.com/php-namespaces-import-alias-resolution/