首先新建一个文件夹name_space,即项目所在目录,
在文件夹中新建三个文件,a.php b.php index.php
其中a.php b.php中定义一个类,
a.php代码如下:
<?php
class Test
{
function get_to()
{
echo "this is a";
}
}
?>
b.php代码如下:
<?php
class Test
{
function get_to()
{
echo "this is b";
}
}
?>
然后,在index.php中进行调用
代码如下:
<?php
require_once('a.php');
require_once('b.php');
?>
通过网页进行访问,这时候报了一个错误
即:Fatal error: Cannot redeclare class Test in E:\nine\lianxi\name_space\b.php on line 4
翻译过来就是:Test 类不能被重写
这是因为文件中的类相同,在调用时发生的冲突问题
这时候就需要应用命名空间
在a.php b.php 中定义各自的命名空间
把a.php 里的代码修改为:
<?php
namespace a\b\c;
//随便定义的一个类的命名空间
//是为了避免冲突
class Test
{
function get_to()
{
echo "this is a";
}
}
?>
b.php文件内容修改为:
<?php
namespace b\a\c;
//随便定义的一个类的命名空间
//是为了避免冲突
class Test
{
function get_to()
{
echo "this is b";
}
}
?>
这样修改后,通过命名空间就分隔开来,再用浏览器访问时就没有错误了;
那么,如何使用文件中的类呢,
修改index.php中的内容:
<?php
/*如果 同时包含文件 而文件中的类是相同的
报错为:
Fatal error: Cannot redeclare class Test in E:\nine\lianxi\name_space\b.php on line 4
解释:Test 类不能被重写
是因为类相同,在调用时发生的冲突问题
这时候就需要应用命名空间
在a.php b.php中定义各自的命名空间
*/
require_once('a.php');
require_once('b.php');
//实例化a.php类
$test_a=new a\b\c\Test();//在实例化类时 需要给程序一个路径 实例化的是那个类
//调用类中的方法 测试一下是否实例化成功
$test_a->get_to();
//实例化a.php类
$test_b=new b\a\c\Test();//在实例化类时 需要给程序一个路径 实例化的是那个类
//调用类中的方法 测试一下是否实例化成功
$test_b->get_to();
?>
网页上输出:
this is athis is b
说明调用到了两个类;
但是,有一点问题了,如果我们尝试加载很多的a.php 和b.php文件的类
那就需要写很多:
$test_a=new a\b\c\Test();
$test_a1=new a\b\c\Test();
$test_a2=new a\b\c\Test();
$test_b=new b\a\c\Test();
$test_b1=new b\a\c\Test();
$test_b2=new b\a\c\Test();
这时候,就可以在require_once下面,使用use来精简代码
代码如下:
require_once('a.php');
require_once('b.php');
use a\b\c\Test;
use b\a\c\Test as Test2;
//因为类名与上面的相同了 会发生冲突
//可以通过 as 起别名来避免冲突
$test_a=new Test();
$test_a1=new Test();
$test_a2=new Test();
$test_b=new Test2();
$test_b1=new Test2();
$test_b2=new Test2();
$test_a->get_to();
echo "<br>";
$test_b->get_to();
结果也不会发生改变。
这时候还可以新建一个文件c.php
代码如下:
<?php
//不设定命名空间
//这时候c.php中的Test类就是一个顶级类(全局类)
class Test
{
function get_to()
{
echo "this is c";
}
}
?>
那么,在index.php也需要加载上c.php文件
require_once('a.php');
require_once('b.php');
require_once('c.php');
use a\b\c\Test;
use b\a\c\Test as Test2;
$test_a=new Test();
$test_b=new Test2();
//那么在调用c.php中的类时
//就需要在类的前面加一个反斜杠
//说明类是一个顶级的,根的类
$test_c=new \Test();
/*$test_a->get_to();
echo "<br>";
$test_b->get_to();*/
$test_c->get_to();
在网页中访问,输出
this is c
那么,php中的命名空间的简单介绍就到此为止了!