命名空间
定义
PHP5.3.0 新增的一种封装事物的方法,解决编写的类库或应用程序时命名冲突的问题,类似window系统的文件夹
关键字 namespace
- 必须声明命名空间,必须处于程序脚本的第一条语句,即声明前不能有任意的字符输出,如空格或html标签等;
- 命名空间中可以包含任意合法的php代码,受命名空间影响的有类、函数、常量
- PHP >=5.3.0 开始支持
- namespace 可以代表当前空间,类似类中的self;
namespace\Home\Student()
创建一个namespace.php文件
<?php
//声明一个App的命名空间
namespace App
//1 定义一个类
class student{
private $name = "小德";
private $age = "28";
public function __construct(){
echo "{$this->name}的年龄是{$this->age}岁";
}
}
//2 定义一个普通函数
function dump($target){
var_dump($target);
}
//3 定义一个局部常量
const WHO = "rufeike";
//4 其他任意代码
$a = 1000;
?>
使用命名空间
- 使用时需要指定空间名称
- 命名空间与类、函数、局部常量间使用
\
分割; - 普通代码 变量、常量不在命名空间中
在当前目录创建一个index.php,引入上面的创建的namespace.php文件,进行测试使用
<?php
//包含namespace.php 文件
require_once("./namespace.php");
//1 创建学生类对象
//注意:直接使用会报错,需要在类前指定命名空间App/Student
/*
报错信息:
Fatal error: Uncaught Error: Class 'Student' not found in C:\Users\rufeike\Desktop\phasher\test\index.php:3 Stack trace: #0 {main} thrown in C:\Users\rufeike\Desktop\phasher\test\index.php on line 3
*/
$student = new App\Student();
//2 调用dump方法
App\dump("hello world!");
//使用局部变量
echo App\WHO;
//普通代码可以直接使用
echo $a;
命名空间子空间
- 使用
\
斜线分割子空间。如 Home\Controller\Student();
定义
<?php
//创建 App\Home\Controller的命名空间
namespace App\Home\Controller;
class Student{
.....
}
使用
<?php
$student = new App\Home\Controller\Student();
命名空间路径
- 文件系统中访问文件的方式
- 相对文件名形式:如:a.txt ,会在当前执行文件的所在文件夹中查找a.txt;
- 相对路径名形式:如:sub/a.txt ,会在当前执行文件的所在文件夹中查找sub文件夹,再在sub中查找a.txt;
- 绝对路径名形式:如:/main/a.txt ,会从根目录(window系统中,会从执行文件的所在盘符中)开始查找main文件夹,再在main中查走a.txt;
- 访问命名空间中的元素方式
- 非限定名称(不带任何前缀)。$obj = new User(),会在单前空间中查找
- 限定名称(带相对空间的前缀)。$obj = new Home\User(),会在当前空间找子空间Home中的User类
- 完成限定名称(从根空间开始)。$obj = new \Home\User(),会从根空间开始查找Home中的User类
命名空间use
使用
- 使用
use
关键字use App\Student;
- 如果引入类与当前空间的类起冲突时,可以使用
as
起别名;如use App\Student as Stu;
- 使用
use
引入后,可以直接使用类名称;$student = new Student()