首页 > IT职业 > IT生活 > 复习PHP-语言参考-命名空间
1.定义命名空间
命名空间只作用于类,函数,常量。(注意只能是const的常量,而不能是define出来的常量,我测试是报错的。)
通过namespace 声明。
必须在所有代码之前声明。
2.定义子命名空间
可以多用层,这样可以理出一个层级结构来,比如LIBRARY里有几个不同类型的库,有层次才显得更清晰。(ACTIONINDEX)
3.在同一文件定义多个命名空间
用大括号括起来,但不推荐
如:
namespace a{func1,class2,const3}
namespace b{xxx}
?>
多个命名空间和执行代码放在一起需要这么干
namespace a{func1,class2,const3}
namespace b{xxx}
namespace{
afunc1();
}
?>
4.使用基础
注意:命名空间的使用有点类似于HTML里URL的规则
如
namespace aa1;
function d(){}
d(); //aa1d()
aa1d(); //aa1d();
一个相对路径,一个绝对路径。
?>
注意:如果你想在一个命名空间内访问全局变量或全局方法或全局类,可以加上
如
namespace Foo;
function strlen() {}
const INI_ALL = 3;
class Exception {}
$a = strlen('hi'); // 调用全局函数strlen
$b = INI_ALL; // 访问全局常量 INI_ALL
$c = new Exception('error'); // 实例化全局类 Exception
?>
提示:如果要实例化一个字符串形式的类名(包含命名空间),那就最好用单引号将字符串引起来。如 $a = new ‘namespaceclassname’;
5.namespace关键字和__NAMESPACE__常量
__NAMESPACE__在全局是一个空字符串
__NAMESPACE__在动态创建变量时非常有用。
比如
namespace abc;
function get($classname)
{
return new __NAMESPACE__.'\'.$classname;
}
?>
__NAMESPACE__在类里也可以用这样动态创建变量什么的,有点类似于self的功能
而namespace 可以当作当前命名空间名称来动态使用,如:
namespace A;
const name = 'jason';
echo namespacename; // print out jason;
?>
如果在全局中使用的话
$a = new namespacec; //这里实际上只有c; 而会忽略namespace 因为它是空的。
?>
6.别名和use的使用
namespace foo;
use MyFullClassname as Another;
// 下面的例子与 use MyFullNSname as NSname 相同
use MyFullNSname;
// 导入一个全局类
use ArrayObject;
$obj = new namespaceAnother; // 实例化 fooAnother 对象
$obj = new Another; // 实例化 MyFullClassname 对象
NSnamesubnsfunc(); // 调用函数 MyFullNSnamesubnsfunc
$a = new ArrayObject(array(1)); // 实例化 ArrayObject 对象
// 如果不使用 "use ArrayObject" ,则实例化一个 fooArrayObject 对象
?>
use MyFullClassname as Another, MyFullNSname;
$obj = new Another; // 实例化 MyFullClassname 对象
NSnamesubnsfunc(); // 调用函数 MyFullNSnamesubnsfunc
?>
use MyFullClassname as Another, MyFullNSname;
$obj = new Another; // 实例化一个 MyFullClassname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
?>
注意:别名不能用变量来代替,如:
use MyFullClassname as Another, MyFullNSname;
$obj = new Another; // 实例化一个 MyFullClassname 对象
$a = 'Another';
$obj = new $a; // 实际化一个 Another 对象
?>
7.全局空间
如果在没有命名空间的脚本里写东西,默认就是全局的,如果非要加个特征码或在命名空间调用全局空间里的类,常量和函数的话,前面加个即可。
8.使用命名空间时,优先级
namespace ABC;
class Exception extends Exception {} //完全限定全局类Exception
?>
注意:在命名空间里,用全局和本身的函数 类和常量时,需要特别小心它是属于哪里的,是全局的还是该命名空间里的,所以:
在命名空间作用域里,用全局的类 常量和函数时,都最好要加上完全限定名称的符号 如fopen,substr 总觉得怪怪的啊。
注意:在一个已有命名空间的脚本里,直接输写无命名空间符号的函数或者常量或者类,它的查找顺序为:
1、先在本命名空间中找该函数,常量或类
2、找不到的时候再在全局里找。
namespace A;
use BD, CE as F;
// 函数调用
foo(); // 首先尝试调用定义在命名空间"A"中的函数foo()
// 再尝试调用全局函数 "foo"
foo(); // 调用全局空间函数 "foo"
myfoo(); // 调用定义在命名空间"Amy"中函数 "foo"
F(); // 首先尝试调用定义在命名空间"A"中的函数 "F"
// 再尝试调用全局函数 "F"
// 类引用
new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象
// 如果未找到,则尝试自动装载类 "AB"
new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
// 如果未找到,则尝试自动装载类 "BD"
new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
// 如果未找到,则尝试自动装载类 "CE"
new B(); // 创建定义在全局空间中的类 "B" 的一个对象
// 如果未发现,则尝试自动装载类 "B"
new D(); // 创建定义在全局空间中的类 "D" 的一个对象
// 如果未发现,则尝试自动装载类 "D"
new F(); // 创建定义在全局空间中的类 "F" 的一个对象
// 如果未发现,则尝试自动装载类 "F"
// 调用另一个命名空间中的静态方法或命名空间函数
Bfoo(); // 调用命名空间 "AB" 中函数 "foo"
B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果未找到类 "AB" ,则尝试自动装载类 "AB"
D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
// 如果类 "BD" 未找到,则尝试自动装载类 "BD"
Bfoo(); // 调用命名空间 "B" 中的函数 "foo"
B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法
// 如果类 "B" 未找到,则尝试自动装载类 "B"
// 当前命名空间中的静态方法或函数
AB::foo(); // 调用命名空间 "AA" 中定义的类 "B" 的 "foo" 方法
// 如果类 "AAB" 未找到,则尝试自动装载类 "AAB"
AB::foo(); // 调用命名空间 "AB" 中定义的类 "B" 的 "foo" 方法
// 如果类 "AB" 未找到,则尝试自动装载类 "AB"
?>
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/658/viewspace-2802104/ ,如需转载,请注明出处,否则将追究法律责任。