命名空间 namespace

命名空间一个最明确的目的就是解决重名问题,在php里边,同一个应用请求里边如果存在两个方法(类名),他们的名字一样(例如都是getName()),由于php本身语法规则的限制,系统是要报错的
解决方法:
  ① 把他们的名字改为不一样的 例如  agetName()   bgetName()
  ② 通过命名空间解决
Yii 框架为了避免名字重复引起问题,同步的类前边都有 C  字样

1 简单应用

  a) 命名空间是虚拟的定义空间,不是真实存在目录
  b) 命名空间的分隔符都是反斜杠
  c) 非限定名称:getName()  获得与其最近的命名空间的getName()
  d) 限定名称:beijinggetName()  相对方式  通过最近的命名空间定位beijinggetName()
  e) 完全限定名称: eijinggetName()  直接在指定的命名空间获得具体元素
  f) 命名空间针对:函数、类名、常量三者其作用,在命名空间里边把这三种统称为元素

<?php 
// 定义命名空间
namespace beijing;
function getNanme(){
    return "hellow";
}
// echo getNanme();
//可以获得上面声明最近的命名空间的getName()
namespace shenyang;
function getName(){
    return "shenyang";    
}

namespace dalian;
function getName(){
    return "world";
}
// echo getName();
// 非限定名称 获得最近命名空间的getName 输出world

// echo beijinggetName();
// 限定名称 会认为在当前命名空间里面获取dalianeijinggetName 会报错

// echo eijinggetName();
// 完全限定名称 会根据命名空间决定使用哪个getName 输出hello

 

2 子空间应用

<?php 
// 子空间使用
namespace beijinghaidian;
function getNanme(){
    return "haidian";
}

namespace hebeihandan;
function getName(){
    return "handan";    
}

namespace beijingchaoyang;
function getName(){
    return "chaoyang";
}

namespace beijingchangping;
function getName(){
    return "changping";
}
// echo getName();
//非限定名称 获得最下边的getName输出changping,使用上边的getName需要使用完全限定名称

// echo beijingchaoyanggetName();
// 限定名称 查找路径beijingchangpingchaoyanggetName() 会报错

// echo hebeihandangetName();
// 完全限定名称 输出handan

3 别名和导入

a)    导入/引入 use
b)    使用一个元素,使用非限定名称,在当前最接近的空间里边获得元素
c)    如果当前空间里边没有指定元素,也可以在导入的空间里边寻找

<?php 
//use的使用
namespace beijing;
function getNanme(){
    return "beijing";
}

namespace shanghai;
function getName(){
    return "shanghai";    
}

class Person{
    static $name="shanghairen";
}

namespace nanjing;
function getName(){
    return "nanjing";
}
// 第一种 空间和元素一并引入
use shanghaiPerson;
echo Person::$name;

// 第二种 只引入空间
use shanghai;
echo shanghaiPerson::$name;

e)    别名应用:
f)    如果在引入空间的时候也把元素给引入了,在当前的空间里边也有同名字的元素,那么这个外来的元素和内部元素要有冲突,这时可以通过别名定义来重新给外来的元素起名字并使用

<?php 
//子空间-引入命名空间应用
namespace beijingchaoyang;
class Person{
    static $name = "chaoyangren";
}

namespace tianjinhexi;
function getName(){
    return "hexi";    
}
class Person{
    static $name="hexiren";
}

// 引入空间(空间和元素都引入)
use beijingchaoyangPerson;
echo Person::$name;

// 引入空间 使用限定名称就可以定位已经引入的空间元素
use beijingchaoyang;
echo chaoyangPerson::$name;

// 引入空间和元素(别名使用)
use beijingchaoyangPerson as pon;
echo pon::$name;

4 公共空间

公共空间有两种情况:
1.    当前有空间,引入没有空间(公共空间)
a)    默认使用当前空间的元素
b)    统一斜杠引入公共空间元素
2.    当前没有空间(公共空间),引入有空间
a)    默认调用当前公共空间的元素(非限定名称)
b)    使用有公共空间的元素  (限定名称、完全限定名称)

同一个页面里边有许多空间,在页面最下边使用上边空间的元素,名称需要使用完全限定名称,还可以把上边空间的元素给use引入过来也可通过非限定名称或限定名称使用

<?php 
//当前没有空间
// 当前文件没有空间,引入文件有空间
// 默认空间就是当前空间
function getName(){
    return "i am first";    
}
class Person{
    static $name="firstman";
}

// 引入带有命名空间的文件
include "./commom2.php";

echo getName();// i am first

echo getName();//同样 i am first
 
echo beijinggetName();//common
echo eijinggetName();//common

use beijingPerson as pon;
echo pon::$name;

命名空间使用注意:
1.    针对类名、函数名、常量const其作用 define()定义的常量不受命名空间限制
2.    声明namespace的当前脚本的第一个命名空间前面不能有任何代码(header头代码也要写在下边)
3.    命名空间是虚拟抽象的空间,不是真实存在的目录
4.    当前文件可以include具有命名空间的文件,默认空间是当前文件的公共空间
5.    元素调用分:非限定名称、限定名称、完全限定名称

简单使用:同一个页面定义了许多单级命名空间
子空间:通过斜杠定义多级命名空间
公共空间:为了程序比较严谨,公共空间的元素都使用斜杠访问
空间引入和别名:use   as

原文地址:https://www.cnblogs.com/aten/p/8274522.html