<?phpclass Test { public static function index(){ echo 'hello world 1'; }}
Fee.php
<?phpclass Test{ public static function index(){ echo 'hello world 2'; }}
然后在index.php分别require这两个文件
<?phprequire './Foo.php';require './Fee.php';Test::index();Test::index();
由于foo.php和fee.php里的类名和方法名都一样,以是在index.php里系统就无法区分到底是调用的那个类,这时运行就会报错

PHP Fatal error: Cannot declare class Test, because the name is already in use in C:\Users\53101\Desktop\study\php\namespace_study\Foo.php on line 3
2. 下面是加入namespace后的样子 Foo.php
<?phpnamespace Foo;class Test { public static function index(){ echo 'hello world 1'; }}
Fee.php
<?phpnamespace Fee;class Test{ public static function index(){ echo 'hello world 2'; }}
然后在index.php分别require这两个文件
<?phprequire './Foo.php';require './Fee.php';Foo\Test::index();Fee\Test::index();
运行得到了想要结果
hello word 1hello word 2
总结:事实上命名空间便是用来区分调用的类或方法来自哪里,类似于java或python里的包的观点,但是功能上还是比较弱,无法帮你自动加载调用的文件,要合营自动加载autoload才能实现更强的功能。3. 详细利用1. namespace的定义通过namespace关键字来定义
<?phpnamespace App;class Test{//...dosomething}
利用花括号定义,没有名字的命名空间相称于全局命名空间,相称于不带命名空间,不该用命名空间默认便是放在全局命名空间下的,但是这种不该用命名空间的代码和带命名空间代码要放在一个文件就必须放在没有名字的命名空间下,必须利用花括号定义。
<?phpnamespace App{ class Test{//...dosomething}}namespace { class Test{//...dosomething}}
namespace前面只许可declare 语句,不能有其它任何代码或空格
<?php$a = '';//报错namespace App;
有一个随意马虎忽略的点便是<?php前面也不能有空格,必须顶格写,不然也会报错
<?php//前面有空格,报错namespace App;
2. 书写规范虽然定义namespace可以随意定义,但是根据PSR-0的哀求,必须有一个上级Vendor Name,一样平常是利用文件夹名,文件夹路径便是namespace的路径,这样方便定位文件。命名规范跟PHP变量基本一样,什么首字母不能是数字啊。只能有数字,字母,下划线_组成,也不能是系统保留关键字等。但是’\’是可以利用的,由于namespace是用’\’来分割目录的。3. namespace的访问利用全路径访问Vendor\namespce\class这样 Foo.php
<?phpnamespace App;class Foo { public static function index() { echo 'hello word 1'; }}
Fee.php
<?phpnamespace App;class Fee { public static function index() { echo 'hello word 2'; }}
index.php
<?phprequire './Fee.php';require './Foo.php';App\Foo::index();//静态方法直接调用$fee = new App\Fee();//非静态方法要先new再调用$fee->index();
非限定名称,或不包含前缀的类名称。利用use关键字引入,碰着引入class重复的可以利用as 关键字定义别名。
<?phprequire './Fee.php';require './Foo.php';use App\Fee;use App\Foo as Alias;Alias::index();//静态方法直接调用$fee = new Fee();//非静态方法要先new再调用$fee->index();
利用完备限定名称,便是利用全路径同时最前面加\,这样就只会在对应路径找对应class或方法
<?phprequire './Fee.php';require './Foo.php';\App\Foo::index();//静态方法直接调用$fee = new \App\Fee();//非静态方法要先new再调用$fee->index();echo \strlen('abc');//前面加\的办法可以用于任何内置方法,不加\默认是在当前命名空间下找对应class或方法
总结:访问有三种办法,要么用use关键字引入,碰着重复的名称用as定义别名,要么用Vendor\namespce\class这种办法,会到对应路径探求,但路径指定不全的话优先在当前命名空间下探求。要么在最前面加上\,就只会到指定路径探求。
4. namespace关键字和NAMESPACE常量namespace 可用来显式访问当前命名空间或子命名空间中的元素。它等价于类中的 self 操作符。<?phpnamespace App;class Foo { public static function index() { echo 'hello word 1'; }}namespace\Foo::index();//输出 hello word 1;
NAMESPACE常量
<?phpnamespace App;class Foo { public static function index() { echo __NAMESPACE__;//可用于动态创建类 }}namespace\Foo::index();//输出 App;
总结:
namespace紧张办理了两个问题
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。为很长的标识符名称(常日是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。定义办法有两种
namespace关键字在文件首行,前面不能有任何代码,只能有declare。namespace花括号定义,可以利用匿名定义,等同于全局命名空间访问办法有三种
use关键字引入然后利用引入的名称调用,碰着引入名称一样利用as定义别名利用限定名称,例如App\Foo::index(),会在当前命名空间下找这个路径的class,这里的App不一定是根命名空间利用完备限定名称,例如\App\Foo::index(),这样只会在给定的路径下探求class,这里的App一定是根命名空间一些特性
namespace可用于访问当前命名空间和子命名空间中的元素,等价于self__NAMESPACE__常量指向当前命名空间名称,是字符串,可以用于动态创建class参考资料: https://www.runoob.com/php/php-namespace.html https://www.zybuluo.com/phper/note/65479