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、命名空间与文件路径的关系
<?php
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 "<br/>";
$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 都会重新编译、生成。