一、PHP的命名空间
1,存在意义(解决什么问题):
一个文件存在多个类,可能出现重名,而且在一个项目中,我们可能除了自己写代码,还会使用GitHub中的第三方开源代码。
2,子命名空间:
与目录和文件的关系很像,PHP 命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义:App\User
<?php
namespace APP
{
class User{
public static function make()
{
return __METHOD__;
}
}
}
?>
<?php
include 'App\User.php';
echo App\User::make();
3,引入方法:
非限定和限定相当于相对路径,而完全限定引入相当于绝对路径。
1)非限定引入:
<?php
namespace APP
{
class User{
public static function make()
{
echo __METHOD__;
}
}
User ::make();
}
?>
这里面的User ::make();就是非限定引入
2)限定引入:
<?php
namespace APP;
include 'Order.php';
class User{
public static function make()
{
echo __METHOD__;
}
}
Controller\Order::make();
<?php
namespace APP\Controller
{
class Order{
public static function make()
{
echo __METHOD__;
}
}
}
?>
这里的Controller\Order::make();就是限定引入
3)完全限定引入:
<?php
namespace APP;
include 'Commont.php';
class User{
public static function make()
{
echo __METHOD__;
}
}
\Commont\Commont::make();
<?php
namespace Commont
{
class Commont{
public static function make()
{
echo __METHOD__;
}
}
}
?>
这里的\Commont\Commont::make();就是完全限定引入
注意:在命名空间中定义常量时,用const定义时,定义出来的常量不是全局的,而用define定义的则是全局的。如果出现引入冲突:例如:出现两个命名空间为:App\Module\Shop\Controller\User和App\Module\Shop\Serverr\User就会发生冲突,这个时候可以使用as起一个别名App\Module\Shop\Serverr\User as UserServer,这样就可以使用了。
一些路径和调用的注意:
<?php
namespace A;
use B\D, C\E as F;
// 函数调用
foo(); // 首先尝试调用定义在命名空间"A"中的函数foo()
// 再尝试调用全局函数 "foo"
\foo(); // 调用全局空间函数 "foo"
my\foo(); // 调用定义在命名空间"A\my"中函数 "foo"
F(); // 首先尝试调用定义在命名空间"A"中的函数 "F"
// 再尝试调用全局函数 "F"
// 类引用
new B(); // 创建命名空间 "A" 中定义的类 "B" 的一个对象
// 如果未找到,则尝试自动装载类 "A\B"
new D(); // 使用导入规则,创建命名空间 "B" 中定义的类 "D" 的一个对象
// 如果未找到,则尝试自动装载类 "B\D"
new F(); // 使用导入规则,创建命名空间 "C" 中定义的类 "E" 的一个对象
// 如果未找到,则尝试自动装载类 "C\E"
new \B(); // 创建定义在全局空间中的类 "B" 的一个对象
// 如果未发现,则尝试自动装载类 "B"
new \D(); // 创建定义在全局空间中的类 "D" 的一个对象
// 如果未发现,则尝试自动装载类 "D"
new \F(); // 创建定义在全局空间中的类 "F" 的一个对象
// 如果未发现,则尝试自动装载类 "F"
// 调用另一个命名空间中的静态方法或命名空间函数
B\foo(); // 调用命名空间 "A\B" 中函数 "foo"
B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果未找到类 "A\B" ,则尝试自动装载类 "A\B"
D::foo(); // 使用导入规则,调用命名空间 "B" 中定义的类 "D" 的 "foo" 方法
// 如果类 "B\D" 未找到,则尝试自动装载类 "B\D"
\B\foo(); // 调用命名空间 "B" 中的函数 "foo"
\B::foo(); // 调用全局空间中的类 "B" 的 "foo" 方法
// 如果类 "B" 未找到,则尝试自动装载类 "B"
// 当前命名空间中的静态方法或函数
A\B::foo(); // 调用命名空间 "A\A" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\A\B" 未找到,则尝试自动装载类 "A\A\B"
\A\B::foo(); // 调用命名空间 "A" 中定义的类 "B" 的 "foo" 方法
// 如果类 "A\B" 未找到,则尝试自动装载类 "A\B"
?>