在写php 程序是有时候会遇到下面这样的错误: (你的类重复定义了); 这时我们就需要命名空间的帮助.
但是这个命名空间和c++的命名空间有一些不同, 我在测试的过程中就遇到一些问题,我把这些问题一一列出来以免以后重蹈覆辙.
这是我文件的目录结构 : ns_test下有一个文件夹和 两个 文件, 在folder下还有一个class3.php的文件
下面是class1.php中的代码:
<span style="font-size:12px;"><?
namespace ns1\s1; //使用命名空间ns1\s1 下面的所有类都在该命名空间中
$path= dirname(__FILE__)."/"; //获得文件所在的文件夹路径
$path=str_replace('\\','/',$path);
//echo $path."class1.php"."<br>";
require_once($path."folder/class3.php");
class c1{
function say()
{
echo "命名空间:ns1\s1: c1 say()<br>";
}
}
class comm_cls{
function say()
{
echo "命名空间:ns1\s1: comm_cls say() <br>";
}
}
function test()
{
echo "命名空间:ns1\s1 :test() <br>";
}
?></span>
下面是class2.php中的代码:
<span style="font-size:12px;"><?
header("Content-type: text/html; charset=utf-8");
//namespace ns1\s1; //有重复的类 在开始声明命名空间的话 该文件下面的所有类和函数就都属于该命名空间
//不声明命名空间 默认就是全局的
$path= dirname(__FILE__)."/"; //获得文件所在的文件夹路径
$path=str_replace('\\','/',$path);
//echo $path."class1.php"."<br>";
require_once($path."class1.php");
class c2{
function say()
{
echo "全局 :c2 say() <br>";
}
}
// 有命名空间的隔离就可以在不同的命名空间中定义相同的类名的类
class comm_cls{
function say()
{
echo "全局: comm_cls say() <br>";
}
}
use ns1\s1 as s2; //定义别名
$t1=new ns1\s1\c1(); //使用完整的命名空间
$t1->say();
s2\test();
$t3=new s2\comm_cls(); //使用命名空间的别名
$t3->say();
$t5=new s2\c3();
$t5->say();
// \s2\test();写法有问题 即在s2前加'\'有问题
$t2=new c2();
$t2->say();
$t4=new comm_cls();
$t4->say();
//namespace ns1\s1; 命名空间应该在代码的最开始声明
?></span>
下面是class3.php中的代码:
<span style="font-size:12px;"><?
namespace ns1\s1; //使用和class1.php 中一样的命名空间
class c3{
function say()
{
echo "命名空间:nsa\s1: c3 say()<br>";
}
}
//如果定义下面的类的话 就会出现重定义错误
// class comm_cls{
// function say()
// {
// echo "s1: c2 say() <br>";
// }
// }
// function test()
// {
// echo "s1 :test() <br>";
// }
?></span>
测试 : 在浏览器中打开class2.php
实际使用