首先新建一个文件夹name_space,即项目所在目录,
在文件夹中新建三个文件,a.php b.php index.php
其中a.php b.php中定义一个类,
a.php代码如下:
<?php class Test { function get_to() { echo "this is a"; } } ?>
<?php class Test { function get_to() { echo "this is b"; } } ?>
代码如下:
<?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"; } } ?>
<?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('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"; } } ?>
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中的命名空间的简单介绍就到这了!