1
2
3
4
5
6
7
8
9
<?php
namespace
AppLib1;
require_once
(
'lib1.php'
);
require_once
(
'lib2.php'
);
header(
'Content-type: text/plain'
);
echo
MYCONST .
"n"
;
echo
MyFunction() .
"n"
;
echo
MyClass::WhoAmI() .
"n"
;
?>
1
2
虽然同时包含了lib1.php和lib2.php,但MYCONST, MyFunction, and MyClass只会引用lib1.php中的代码。因为myapp1.php的代码同样位于App\lib1命名空间内。
result:
App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI
<strong>命名空间导入</strong>
命名空间可通过use操作符导入。例如
myapp2.php 3
4
1
2
3
4
5
6
7
8
9
<?php
use
AppLib2;
require_once
(
'lib1.php'
);
require_once
(
'lib2.php'
);
header(
'Content-type: text/plain'
);
echo
Lib2MYCONST .
"n"
;
echo
Lib2MyFunction() .
"n"
;
echo
Lib2MyClass::WhoAmI() .
"n"
;
?>
5
6
7
8
9
App\Lib2\MYCONST
App\Lib2\MyFunction
App\Lib2\MyClass::WhoAmI
<?php
namespace
AppLib1;
require_once
(
'lib1.php'
);
require_once
(
'lib2.php'
);
header(
'Content-type: text/plain'
);
1
2
3
4
5
6
7
8
9
10
11
<?php
use
AppLib1
as
L;
use
AppLib2MyClass
as
Obj;
header(
'Content-type: text/plain'
);
require_once
(
'lib1.php'
);
require_once
(
'lib2.php'
);
echo
LMYCONST .
"n"
;
echo
LMyFunction() .
"n"
;
echo
LMyClass::WhoAmI() .
"n"
;
echo
Obj::WhoAmI() .
"n"
;
?>
echo
MYCONST .
"n"
;
echo
MyFunction() .
"n"
;
echo
MyClass::WhoAmI() .
"n"
;
?>
1
2
3
4
5
6
7
8
9
<?php
<🎜>
<🎜>use
AppLib2;
<🎜>
<🎜>require_once
(
'lib1.php'
);
<🎜>
<🎜>require_once
(
'lib2.php'
);
<🎜>
<🎜>header(
'Content-type: text/plain'
);
<🎜>
<🎜>echo
Lib2MYCONST .
"n"
;
<🎜>
<🎜>echo
Lib2MyFunction() .
"n"
;
<🎜>
<🎜>echo
Lib2MyClass::WhoAmI() .
"n"
;
<🎜>
<🎜>?>
可使用任意数量的use语句或使用逗号分隔每个独立的命名空间。在此例中,导入了“AppLib2”命名空间。但此刻仍然无法直接引用MYCONST, MyFunction 或 MyClass,因为调用他们的代码位于全局空间内,PHP将会在全局空间内查找它们。然而,如果我们加入“Lib2”前缀,它们便形成部分限定名,PHP将会在已导入的命名空间内搜索直到找到匹配项。
result
命名空间别名
命名空间别名或许是最有帮助的功能。别名可使较短的名称来代替较长名称。
myapp3.php
1
2
3
4
5
6
7
8
9
10
11
<?php
<🎜>
<🎜>use
AppLib1
as
L;
<🎜>
<🎜>use
AppLib2MyClass
as
Obj;
<🎜>
<🎜>header(
'Content-type: text/plain'
);
<🎜>
<🎜>require_once
(
'lib1.php'
);
<🎜>
<🎜>require_once
(
'lib2.php'
);
<🎜>
<🎜>echo
LMYCONST .
"n"
;
<🎜>
<🎜>echo
LMyFunction() .
"n"
;
<🎜>
<🎜>echo
LMyClass::WhoAmI() .
"n"
;
<🎜>
<🎜>echo
Obj::WhoAmI() .
"n"
;
<🎜>
<🎜>?>
第一个use语句设定"App/Lib1"的别名为“L”,任何使用"L"的部分限定名都会在编译阶段被解释为“App/Lib1”。因此可使用 L\MYCONST 和 L\MyFunction来代替完全限定名。
第二个use语句非常有趣。它将'Obj'设定为App\Lib2命名空间内的类MyClass的别名。这种别名设定方式只对类有效,常量与函数不适用。
设定类别名后,就可以用new Obj()来创建实例或直接调用静态方法了。
App\Lib1\MYCONST
App\Lib1\MyFunction
App\Lib1\MyClass::WhoAmI
App\Lib2\MyClass::WhoAmI
PHP命名解析规则 PHP标识符命名解析遵循以下规则: 1. 在编译阶段解析拥有完全限定名的常量、类或函数的调用。 2. 未限定和部分限定名根据命名空间导入规则进行解释。例如,如果命名空间A\B\C被导入且设定别名为C,那么C\D\e()调用将被解释为A\B\C\D\e() 3. 在命名空间内,所有未根据命名空间导入规则进行解释的部分限定名都会拥有当前命名空间的前缀。例如:如果在命名空间A\B内执行C\D\e()调用,它将会被解释为 A\B\C\D\e()。
4. 未限定的类名会根据当前导入的命名空间进行解释,同时会使用全名来代替缩写后的名称。例如:如果在命名空间A\B内的类C被导入为X,new X()将被解释为 new A\B\C()。<br> 5. 命名空间内的未限定函数调用会在运行时解析。例如:如果MyFunction()在命名空间A\B内被调用,PHP首先会搜索函数\A\B\MyFunction(),如果未找到匹配项,PHP会在全局空间内搜索\MyFunction()函数。<br> 6. 调用未限定或部分限定名的类会在运行时解析。例如:如果在命名空间A\B内调用new C(),PHP会搜索类A\B\C,如果未能找到匹配项,PHP将会试图自动载入类A\B\C。
声明: 本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn