php命名空间

首先新建一个文件夹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中的命名空间的简单介绍就到这了!



你可能感兴趣的:(php命名空间)