PHP namespace 和 use
一、使用namespace的目的
简单一句话: 防止类冲突
为什么会 类冲突?
团队合作的项目中或个人项目中,有可能会建一些相同的类,当同事导入相同类文件时,此时new 一下就会产生error的错误
二、namespace的使用方法
- 1、namespace后命名的定义不区分大小写
namespace one
namespace One
namespace ONE
-
2、没有定义命名空间,就理解为使用顶级命名空间。new类时,可以在类前加上反斜杠,也可以不加。
- person.php
class person { function __construct() { echo 'this is person'; } }- index.php
require_once('./person.php'); new person(); // this is person // new \person(); // this is person -
3、new类时,带上命名空间时,之间一定用反斜杠字符,而不是顺斜杠。
- person.php
namespace App; class person { function __construct() { echo 'this is person'; } }- index.php
require_once('./person.php'); new \App\person(); // 记住是反斜杠 App 前面可以不用加反斜杠 -
4、命名空间声明后的代码便属于这个命名空间,即使有include或require也不影响(重点是对后半句的理解,具体看代码)。
- dog.php
namespace Animal; class dog { public function __construct() { echo 'this is dog'; } }- person/person.php
namespace person; require_once('../dog.php'); new \Animal\dog(); // Animal 前必须加反斜杠,如果不加的话就会变成person\Animal\dog ,因为Animal\dog 不属于person命令空间下 // new dog(); // error 因为 person 下没有dog 类 -
5、同命名空间下,类的使用可以省略一部分命令空间前缀
- cat.php
namespace Animal; class cat { public function __construct(){ echo 'this is cat'; } }- index.php
namespace Animal; require_once('./cat.php'); new cat(); // 省略了\Animal 因为在同一个命名空间下 // new \Animal\cat() // -
六、一个php文件可以有多个namespace
namespace test; echo 'zhai14'; namespace zhai; require './1.php';
三 使用use的目的:
在命名空间字符串过长时,使用use可以相应的缩短命名空间
四、如何使用use
-
使用 use 导入类
- animal/dog.php
namespace Animal; class dog { function __construct(){ echo 'this is dog'; } }- index.php
require_once('./animal/dog.php'); // 加载php文件 use Animal\dog; // 导入dog 类 new dog(); -
使用use 重命名类
- index.php
require_once('./animal/dog.php'); use Animal\dog as cat ; new cat(); -
使用use 导入类,方法,常量
// PHP 7 之前版本需要使用多次 use
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;
use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;
use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;
// PHP 7+ 之后版本可以使用一个 use 导入同一个 namespace 的类
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};
五、总结
- namespace
为了防止类,方法,常量的冲突,将这些冲突的类,方法,常量划分到不同名称空间中,这样在use 使用时就不会产生冲突了
- use 使用的总结
1、在use 前 必须先导入 你需要使用类的文件
2、必须确保导入的文件是有namespace的,否则不能使用use
3、可对使用的类,方法,常量重命名
- 导入文件
想要使用另一个php文件的代码,就必须先加载导入文件,才可以使用,上面我们都通过require_once 导入文件的,
其实可以使用php 内置函数 spl_autoload_register,自动加载文件,无需手动加载。当然规则要写好,每次use 带入类时都会自动先加载文件的。

浙公网安备 33010602011771号