PHP 命名空间使用--规约探索

探索一:namespace 有无的区别:

假设:在一个Application.php 中定义一个class Application, 且申明命名空间,如下:

<?php
namespace app;

class Application
{

    protected function getClass()
    {
        return __CLASS__.PHP_EOL;
    }

}

然后在测试文件中使用它:

<?php

require '../app/Application.php';

new Application();

然后就报错了,报错的大概意思就是并没有在测试文件中找到该类

呃?!!! 为啥,我明明引用了Application.php啊~

侦探分析时刻:

首先是官方文档解释:

首先需要认清命名空间的作用,就是给文件的属性上添加一个在逻辑上(php中)的位置路径,而不限于物理路径上,而demo中为什么报错,是因为Application.php中已经声明了命名空间,那么就需要按照就要使用其给定的逻辑路径去访问class Application了,而不再是简单的new Application,当然访问的前提还是需要引入该文件,不同的是,需要使用类(这里是特指类,还包括方法、常量等也可以)的逻辑路径去使用它。

那么如何修改bug呢?方法有三:

一:

在demo文件中,声明命名空间,且需要class Application所 声明的命名空间相同,在同一个逻辑路径下,就可以通过相对逻辑路径进行对class Application的访问了,如下:

<?php
namespace app;

require '../app/Application.php';

new Application();

二:

使用use,申明要使用文件的逻辑路径;

<?php
use app\Application;

require '../app/Application.php';

new Application();

三:

使用逻辑路径去调用类

<?php

require '../app/Application.php';

new app\Application();

那么针对,如果我不use文件完整的逻辑路径,而只是use逻辑路径的相当于目录部分的路劲,又会怎么样?

即:

<?php

use app\*;

php似乎还不支持的,

以下是关于use的介绍:

对于我们在demo中调用的class Application,其完整的逻辑路径又是如何?

有下面三种情况

<?php

require '../app/Application.php';

new app\Application();

使用OK,Application完整的逻辑路径应该为\app\Application,为什么呢?再看。

<?php

require '../app/Application.php';

new \app\Application();

这两种都没有报错,因为Application完整的逻辑路径确实为\app\Application,那么为什么第一种情况也可以呢,因为demo中并没有声明命名空间,默认为'\',第一种情况可以解释为在demo所在的命名空间下利用相对逻辑路径调用Application,所以Application完整的逻辑路径确实为\app\Application,

因此这种情况就会报错:

<?php
namespace web;

require '../app/Application.php';

new app\Application();

因为此时Application的完整逻辑路径成为了 \web\app\Application

官方解释如下:

故:在使用命名空间的时候,需要注意引用脚本的命名空间和被引用脚本的命名空间,从而使用先对逻辑路径或者绝对路径

发布了31 篇原创文章 · 获赞 3 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/qq_36557960/article/details/90340934