概念
php命名空间就像相当于是操作系统中目录一样,可以将两个重名的文件放在不同的文件夹下面,这样就避免了冲突;
PHP命名空间主要解决以下两类问题:
1、用户编写的代码与php内部的类、函数、常量或第三方类、函数、常量之间的名字冲突
2、为很长的标识符名称创建一个别名,提高代码可读性;
定义命名空间
namespace blog1;
class Student{
public $name;
public function _construct($name){
$this->name=$name;
}
}
namespace blog2;
class Student{
public $age;
public function _construct($age){
$this->age=$age;
}
}
$s = new Student("123");
echo $s->age;
上面创建了两个命名空间,blog1和blog2;
每个命名空间的范围是从定义语句开始一直到下一个命名空间的定义语句;
$s = new Student(“123”);这里的Student是属于blog2的;
如果想使用blog1中的Student类,就要采用绝对路径的方法
$s=new \blog1\Student(“123”);
全局空间
全局空间也是公共空间,不属于我们定义的任意一个空间。公共空间的类、属性、方法在每一个空间都能够使用;
namespace blog3;
//var_dump是系统函数名,如果不定义到我们自己定义的空间中,会产生冲突从而报错
function var_dump($data){
echo $data;
}
//调用的是blog3中的函数
var_dump("hello");
echo "\n";
//调用的是系统函数
\var_dump("hello");
如果我们在自己的命名空间中定义了一个与系统函数重名的函数,如果想要使用系统函数就必须加上“\”
除了系统函数属于公共空间,我们如果不在自己的空间中定义的函数,也属于公共空间。
子空间
子空间简单来说就是空间下面还有空间;
//子空间
namespace blog4;
namespace blog4\controller;
function f1(){
echo "blog4\controller\n";
}
namespace blog4\model;
function f1(){
echo "blog4\model\n";
}
namespace blog4\view;
function f1(){
echo "blog4\\view\n";
}
//调用命名空间blog4\view
f1();
//调用命名空间blog4\controller
\blog4\controller\f1();
//调用命名空间blog4\model
\blog4\model\f1();
使用命名空间
如何使用路径
非限定名称
使用类、属性、函数时,不加前缀,直接使用元素名称;
namespace blog1;
class beauty{
public function __construct()
{
echo "beauty";
}
}
$b=new beauty()
限定名称
包含前缀的名称,类似于相对路径,是相对于当前的命名空间定位的,主要适合于使用当前命名空间的子空间中的类等元素;
新建一个文件,命名为namespace.php
namespace blog1\controller;
class beauty{
public function __construct()
{
echo "controller/beauty";
}
}
在父空间下编写代码
namespace blog1;
class beauty{
public function __construct()
{
echo "beauty";
}
}
require_once './namespace.php';
/**
* 在当前命名空间下使用子空间中的类,需要在类名前面加上子空间名称前缀
* 最终的路径如下 blog1\controller\beauty
*/
$b=new controller\beauty();
完全限定名称
相当于绝对路径,完全限定名称与限定名称的区别主要是前面是否加上了“\”
使用完全限定名称的 作用还是为了使用其他命名空间中的元素;
namespace blog2;
class Beauty{
public function __construct()
{
echo "blog2\beauty";
}
}
class beauty{
public function __construct()
{
echo "beauty";
}
}
require_once 'namespace.php';
$s=new \blog2\Beauty();
导入命名空间
如果我们使用的类不在当前的命名空间下,则在使用类的名称时要加入前缀,
导入命名空间可以看做时调用其他命名空间元素的一种快捷方式,可以省略前缀
修改上面的代码
require_once 'namespace.php';
/**
* 导入命名空间blog2,
* 使用User类时可以省却前面的“\”
*/
use blog2;
$s=new blog2\User();
直接导入,省略前缀
require_once 'namespace.php';
/**
* 导入命名空间blog2中的Userl类,
* 使用User类时可以省却前面的所有前缀
*/
use blog2\User;
$s=new User();
使用别名
require_once 'namespace.php';
/**
* 如果导入的命名空间中的类与当前命名空间中的类重名,
* 则可以为其设置别名
*/
use blog2\beauty as B;
$s=new B();