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、命名空间与文件路径的关系

<?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 都会重新编译、生成。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • mean to add the formatted="false" attribute?.[ 46% 47325/...
    ProZoom阅读 2,726评论 0 3
  • 此文记录自己学习PHP和mySQL的过程。之前在网上简单地学习了一下这两门语言,并且自己编写了PHP,可以正常连接...
    阿木林_李阅读 2,823评论 1 2
  • 一、 为什么需要命名空间(问题提出) 命名空间是ANSIC++引入的可以由用户命名的作用域,用来处理程序中 常见的...
    IvanRunning阅读 2,392评论 0 2
  • Php:脚本语言,网站建设,服务器端运行 PHP定义:一种服务器端的HTML脚本/编程语言,是一种简单的、面向对象...
    廖马儿阅读 2,197评论 2 38
  • 在C语言中,五种基本数据类型存储空间长度的排列顺序是: A)char B)char=int<=float C)ch...
    夏天再来阅读 3,417评论 0 2