资讯专栏INFORMATION COLUMN

PHP use类文件中的命名空间问题解析

Zack / 2086人阅读

摘要:但实际上在命名空间这里却不一样,不同类文件中的命名空间之间是相互分离的,即某个文件中定义的的命名空间,在其他的类文件中不能使用。解决在中添加依赖类库的命名空间别名以上就是今天遇到的关于命名空间的一个坑,谨记于此。

(没想好title,见谅)

导读

PHP的类文件在被其他文件include的时候不能直接使用其他文件中的已定义的别名。
比如有三个文件。

    test.php 一个简单的脚本运行文件
    NameSpaceClass.php 一个类文件,定义了一个命名空间
    UseNameSpace.php,一个类文件,使用了NameSpaceClass命名空间里的类方法
问题描述

如果在test.php文件中先定义了一个命名空间别名(use) ,且是NameSpaceClass的命名空间别名,然后直接include UseNameSpace.php,注意,先假设这里的UseNameSpace.php里不使用任何关于命名空间的东西。那么test.php代码能正常运行么。

实践

我们先来看看这三个文件内容
test.php

use UtilNameSpaceClass;
include("./NameSpaceClass.php");
include("./UseNameSpace.php");
UseNameSpace::out_put();

NameSpaceClass.php

namespace Util;
class NameSpaceClass
{
   public static function out_put()
   {
      echo "This is a Utils namespace 
";
   }
}

UseNameSpace.php:

class UseNameSpace
{
        public static function use_out_put()
        {
                echo NameSpaceClass::out_put();
        }
}

从上面可以看出, NameSpaceClass.php里定义了一个命名空间Util, 并定义了类NameSpaceClass, 以及一个静态方法out_put, 方法中只是输出了一行字符串

UseNameSpace.php 中暂时未定义命名空间,但他的类方法直接调用了NameSpaceClass的方法,我们知道直接这么做是错误的,因为两个根本不在一个命名空间内。

test.php 直接静态调用UseNameSpace的方法,最终希望输出NameSpaceClass.php中的内容

假设

如果就目前这种代码,直接运行test.php,会发生社么事情??
按照惯性思维,这种方式test从上到下,一次定义命名空间别名,加载类文件,输出结果,虽然最终的UseNameSpace不在NameSpaceClass的命名空间内,但最开始已经定义命名空间别名(use UtilNameSpaceClass;)了, 应该会没问题的了。

实践结果
PHP Fatal error:  Class "NameSpaceClass" not found in /tmp/UseNameSpace.php on line 7

结果却出现了错误

分析

惯性思维里,php的include操作类似于把要include的文件内容直接插入到该include的位置, 被include的文件应该直接能使用原有文件的已经定义的任何内容。

但实际上在命名空间这里却不一样, 不同类文件中的命名空间之间是相互分离的,即某个文件中定义的use的命名空间,在其他的类文件中不能使用。 

以下来自一个大牛对我的指导(涨姿势)

在包括其他的许多语言中,在定义类库文件的时候,会在类库中定义好本身的依赖关系,并做好不同情况下的兼容处理,而这也正式底层类库的设计难点

我们PHP的命名空间正是这种依赖关系的一个体现,在定义好了一个类库后,我们应该也要定义好他依赖的本类库甚至是第三方的命名空间(用use),我们不能指望用户在拿到这个类库后还要自己去尝试找到类的依赖命名空间,最起码,我们应该给他一个提示,使用了哪些命名空间,怎么加载等等。

解决

UseNameSpace.php中添加依赖类库的命名空间别名

    use UtilNameSpaceClass;

以上就是今天遇到的关于php命名空间的一个坑,谨记于此。

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/20945.html

相关文章

  • PHP命名空间

    摘要:命名空间的支持版本,。另外,在目录外访问文件时,我们必须将目录名以及目录分隔符放在文件名之前得到。定义命名空间命名空间通过关键字来声明。常量常量的值是包含当前命名空间名称的字符串。 *命名空间的支持版本:PHP 5 > 5.3.0,PHP 7 。 什么是命名空间 从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于...

    RaoMeng 评论0 收藏0
  • 【转】php命名空间

    摘要:命名空间可以解决以下两类问题用户编写的代码与内部的类函数常量或第三方类函数常量之间的名字冲突。在命名空间内部访问全局类函数和常量调用全局函数访问全局常量实例化全局类命名空间和动态语言特征命名空间的实现受到其语言自身的动态特征的影响。 PHP 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要...

    Jrain 评论0 收藏0
  • 【解惑】由namespace引发的关于加载的思考

    摘要:命名空间到底解决了什么问题在入了关键字以及魔术常量,命名空间的作用是为了解决重名问题。发现了脚本情况下只引入命名空间是找不到类的这个事实。可以有很多写法和不同的用法,框架在此基础上可以添加命名空间的映射,实现根据命名空间加载对应目录的工作。 1.命名空间到底解决了什么问题? PHP在5.3.0入了namespace关键字以及__NAMESPACE__魔术常量,命名空间的作用是为了解决重...

    yimo 评论0 收藏0
  • php易错笔记-与对象,命名空间

    摘要:类与对象基本概念如果在之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。如果一个类被声明为,则不能被继承。命名空间通过关键字来声明。 类与对象 基本概念 new:如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 ...

    MartinHan 评论0 收藏0
  • PHP自动加载功能原理解析

    摘要:前言在开始之前,欢迎关注我自己的博客这篇文章是对自动加载功能的一个总结,内容涉及的自动加载功能的命名空间的与标准等内容。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 前言 在开始之前,欢迎关注我自己的博客:www.leoyang90.cn 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能、P...

    Imfan 评论0 收藏0

发表评论

0条评论

Zack

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<