1 PHP命名空间 - namespace
1.1 概念和使用
PHP 命名空间namespace
是为了解决重名问题,PHP中不允许两个函数或者类出现相同的名字。
1.2 定义命名空间
命名空间通过关键字namespace
来声明。如果一个文件中包含命名空间,它必须在其它所有代码之前声明命名空间。
<?php
// 定义代码在 'MyProject' 命名空间中
namespace MyProject;
// ... code ...
第一个命名空间前不允许有任何代码,否则,会报错:
Fatal error: Namespace declaration statement has to be the very first statement or after any declare call in the script in ……
1.3 定义子命名空间
与目录和文件的关系很像,PHP
命名空间也允许指定层次化的命名空间的名称。因此,命名空间的名字可以使用分层次的方式定义
<?php
namespace MyProject\Sub\Level; //声明分层次的单个命名空间
// …code…
?>
1.4 调用namespace
\userCenter\login; //绝对调用
userCenter\login; //相对调用
use userCenter\login; //引用空间
use userCenter\login as regName;//引用空间+别名
1.5 例子
1.5.1 举例 - 同一个文件下多个命名空间
<?php
namespace projectA;
class project{
public function printTest(){
echo "project - A - test";
echo "</Br>";
}
}
namespace projectB;
class project{
public function printTest(){
echo "project - B - test";
echo "</Br>";
}
}
//在 projectB的命名空间下实例化的对象是 projectB 空间下的对象
$project1 = new project();
$project1 -> printTest();
// 调用projectA 目录下的 project 对象的方法
$project2 = new \projectA\project();
$project2 -> printTest();
// 创建子空间
namespace projectB\childSpace;
1.5.2 举例 - 命名空间在重名类中的应用
注意 :new
类时,带上命名空间时,之间一定用反斜杠字符,而不是顺斜杠。
有以下目录结构,两个目录文件下都存在一个IndexDao
的类,并包含一个入口文件。
即:使用了一种像文件路径的语法: \空间名\元素名
入口文件index.php
的代码如下:
<?php
error_reporting(0);
include_once("../namespace/testOne/indexDao.php");
include_once("../namespace/testTwo/indexDao.php");
$indexDao = new \TEST\ONE\dao\IndexDAO();
$indexDaoTwo = new TEST\Two\dao\IndexDAO();
$indexDao->test();
$indexDaoTwo->test();
运行结果如下:
注意 : 在这种应用中,除了使用命名空间区别类,还要使用include_once
完成物理文件上的引用。
2 PHP - use 关键字的使用
2.1 概念与使用
use
: 简单说就是起别名,引入namespace
后导致一个类完整的名称可能会特别长。
2.2 举例 - use 和 namespace的配合使用
入口文件 index.php
的代码如下
<?php
error_reporting(0);
include_once("../namespace/testOne/indexDao.php");
include_once("../namespace/testTwo/indexDao.php");
use TEST\ONE\dao as indexDaoOne;
use TEST\Two\dao as indexDaoTwo;
$indexDao = new indexDaoOne\IndexDAO();
$indexDaoTwo = new indexDaoTwo\IndexDAO();
$indexDao->test();
$indexDaoTwo->test();