首先参照php手册上讲解的:
在PHP中,命名空间用来解决两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称创建一个别名(或简短)的名称,提高源代码的可读性。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。
我们先写一个demo:
新建a.php
class Dog{
function say()
{
echo 'this is a dog';
}
}
新建b.php
class Dog{
function say()
{
echo 'this is b dog';
}
}
然后新建入口文件index.php
<?php
require("a.php");
require("b.php");
say();
由于当前a.php和b.php都存在相同的类名Dog,请求index.php会提示:
Fatal error: Cannot declare class Dog, because the name is already in use in D:\www\a\b.php on line 3
对于名字冲突,我们使用namespace改造a.php和b.php
修改a.php,添加
namespace a\b\c;
class Dog{
function say()
{
echo 'this is a dog.';
}
}
新建b.php
namespace c\d\e;
class Dog{
function say()
{
echo 'this is b dog.';
}
}
然后运行index.php文件。没有报错;
我们修改index.php,实例化a.php的Dog类:
require("a.php");
require("b.php");
$a = new a\b\c\Dog();
$a->say();
$b = new c\d\e\Dog();
$b->say();
返回: this is a dog. this is b dog.
说明实例化a.php的Dog类成功。
接下来我们使用use操作符来使得代码更加简单易懂:
//使用use操作符,声明类命名空间
use a\b\c\Dog;
require("a.php");
require("b.php");
//原始
$a = new a\b\c\Dog();
$a->say();
//修改后
$a = new Dog();
$a->say();
现在就可以简化实例化命名空间。
注意的是,use操作符声明类的时候,命名空间加类名。
现在还有一个问题,如果我们给a.php和b.php都引入的命名空间申明:
use a\b\c\Dog;
use c\d\e\Dog;
那么运行程序,又会报类重名异常。
这里我们就要使用use命名空间别名设置:
use a\b\c\Dog
use c\d\e\Dog as Dog2
require("a.php");
require("b.php");
$a = new Dog();
$a->say();
$b = new Dog2();
$b->say();
现在程序就能正常运行了。
总结:
参照PSR-4规范:类的命名空间一般使用文件路径。或参照项目结构来设计。层级的命名空间在多个外部类的实例化和自动加载方面确实做到了规范化。
网友评论