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