PHP命名空间及命名空间与文件路径的关系

1、命名空间的引入原因

命名空间的引入是为了解决变量或者函数的名字冲突;

举个例子来说,

对于文件A.php 、B.php 和C.php 这三个文件;

A.php 文件中 有变量定义为 $a=1;

B.php 文件中 有变量定义为 $a=1;

文件 C.php 中 引用 A 、B文件,并使用 变量 $a;

那么C.php中会使用何值?

2、关于同名变量中值的定义

此时系统不会出现任何错误;但会出现下列问题:

一、include “a.php”;

      include "b.php"

则使用的是b.php 中定义值;

二、include "b.php";

      include "a.php";

则使用的是a.php 中的定义值;

由此可见,文件引入的顺序不同,变量的定义值完全不同。采用的覆盖的原则;因此具有变量值的不确定性。

3、命名空间的本质

PHP 命名空间可以解决以下两类问题:

1.用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

2.为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。

命名空间的本质还是一个标识符,这个标识符用来作为容器,来标识该代码空间下的所有内容。

在被引用的PHP 文件中引入了命名空间之后,如果应用部分未使用空间名称,会直接造成变量无法解析。因为此时的变量名称已经改变了,全称应该是空间名+本地变量名称。

4、命名空间与文件路径的关系

header("Content-type:text/html;charset=utf-8");

include_once "./modelA/a.php";

include_once "./modelB/a.php";

use modelA\a;

use modelB\a as b;

a::out();

echo "
";

$b = new b();

$b->out();

---------------------

在这种方法中,需要使用iniclude_once()方法引入文件,也需要使用命名空间。可能有些人会认为:不是已经使用use modelA\a了吗,那就应该把文件引入进来了,为什么还要include_once()一下呢?那是因为use modelA\a仅仅是声明要使用modelA命名空间下的a文件,可以理解为逻辑上的使用,为了防止重名。而include_once()则是物理上的使用,将代码导入到c.php中。use 和 include缺一不可。

---------------------

Laravel 采用 classmap 方式进行自动加载(autoload),PHP虽然有了命名空间这个高级特性,但是这只是逻辑关系,require 文件还是要有的。

这个类和文件的对应关系就存在 /vendor/composer/autoload_classmap.php ,每次 composer dump-autoload 都会重新编译、生成。

你可能感兴趣的:(PHP命名空间及命名空间与文件路径的关系)