命名空间和全局空间
1. 在全局空间中引用命名空间的类,用use关键字引入命名空间的类,as起别名。若引入函数则为use function venter\session\iLikeImooc;引入常量则为use const venter\IMOOC;
2.在命名空间中引用全局空间的类,若为namespace venter,即命名空间为venter,如new Test();类默认为venter\Test();找不到会报错,在类前加反斜杠new \Test();则为找到全局空间的Test类。函数和常量会先在命名空间中找,找不到会去全局找。
两个类的类名相同,会出现错误。 所以引入了命名空间。
和文件中的目录一样,同一目录不存在相同命名的文件,而不同目录存在相同命名的文件。 命名空间借鉴了这种方法。
php:
<?php namespace venter; //用namespace关键字,Imooc类和iLikeImooc()函数和IMOOC常量就在venter命名空间下 class Imooc { } function iLikeImooc(){ echo "i Like imooc"; } //曾经用define()定义一个常量,这个不受命名空间影响,所以用const定义常量 const IMOOC = 'nice';
2.php:
<?php namespace venter\session; //用\表示session是venter下一级, class Imooc { }
main.php:
<?php include '1.php'; include '2.php'; var_dump(new venter\Imooc()); var_dump(new venter\session\Imooc()); //两个同名类就都可打印了 venter\iLikeImooc(); //两个同名函数就可调用了 echo(venter\IMOOC); //同名常量都可打印出来了
还可以这样:
main.php:
<?php include '1.php'; include '2.php'; use venter\session\Imooc; var_dump(new Imooc()); //就不需要这样一大串var_dump(new venter\session\Imooc()); use venter\Imooc as Imooc2; //另一同名类用as取名为Imooc2 var_dump(new Imooc2()); use function venter\iLikeImooc; //函数,use后需要有function ,能加as命名 iLikeImooc(); use const venter\IMOOC; //常量,use后要有const var_dump(IMOOC);
当没有使用namespace来指定当前脚本的命名空间时,则当前脚本存在于全局命名空间。命名空间分两个,一个是有被指定,一个没有指定。
3.php:
<?php class Test1 { } function Text2() { } const TEST3 = 'test3';
index.php:
<?php namespace index; include '3.php'; var_dump(new \Text1()); //在此脚本文件有命名空间下,会找此命名空间的类, //若是var_dump(new Text1())因为Text1是3.php是全局空间的类,就会报错,找不到类。所以Text1前加\ Test2(); //函数和常量在此命名空间下若没有,会自动在全局空间3.php里找,而类不自动去全局空间找,所以要加\ echo(TEST3);
命名空间
例如:namespace venter;
namespace venter\session
调用:命名空间(venter)\ 成员(Imooc())
将类,函数,常量导入命名空间
例如:
use venter\session\Imooc();
use venter\Imooc as Imooc2;
use function venter\iLIkeImooc;
use const venter\Imooc;
命名空间需要调用全局空间定义的类需要添加“\”;而方法或者常量不需要,因为方法或者常量发现在当前命名空间没找到的话,会去全局命名空间找
命名空间一般对类起作用,方法会自动寻找类名。
类调用 use\venter\session\Imooc;
类重命名 use\venter\Imooc as Imooc2;
方法调用 use function venter\iLikeImooc;
常量使用const: use const venter\IMOOC;
全局空间使用\
2-3 命名空间
常量定义 - const 和 define 的区别
define 定义的常量是全局的,不受命名空间影响; 如果要定义受命名空间影响的常量,就要使用 const 。
以下类型会受到命名空间的影响:
类(包括抽象类、traits)、接口、函数和常量
use 关键词 - 导入
use ... as ... 关键词 - 导入 & 使用别名
use - 导入类
use function ... - 导入函数
use const ... 导入常量
namespace index;
include '3.php';
var_dump(new \Test1());
备注: \ 反斜杠表示全局空间
define 定义的常量为全局的,
在类中定义常量要用const
php的命名空间与文件目录相似
命名空间重名处理,导入类,方法,常量
全局空间下的类是不能在命名空间里调用的
*命名空间
命名空间与文件系统
如果是全局空间的类 用\去掉用
如果当前命名空间中不存在这个类 则会报错 需用\
如果当前命名空间中不存在调用的函数或者常亮 则会去全局空间进行查找
use function dir1\dir2
命名空间受影响类型
类(包括抽象类/traits),接口,函数和常量;define定义的常量是全局的,不受命名空间影响,使用const定义的常量才会受命名空间影响
函数与const常量在命名空间内调用全局空间函数与const常量无需特殊操作,二类则必须添加反斜杠\
namespace venter\session
new venter\session\Imooc
use venter\session\Imooc 类
use venter\Imooc as Imooc2 类
use function venter\session\iLikeImooc 函数
use const venter\Imooc 常量
namespace 命名空间