摘要:但实际上在命名空间这里却不一样,不同类文件中的命名空间之间是相互分离的,即某个文件中定义的的命名空间,在其他的类文件中不能使用。解决在中添加依赖类库的命名空间别名以上就是今天遇到的关于命名空间的一个坑,谨记于此。
(没想好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 命名空间(namespace)是在PHP 5.3中加入的,如果你学过C#和Java,那命名空间就不算什么新事物。 不过在PHP当中还是有着相当重要...
摘要:命名空间到底解决了什么问题在入了关键字以及魔术常量,命名空间的作用是为了解决重名问题。发现了脚本情况下只引入命名空间是找不到类的这个事实。可以有很多写法和不同的用法,框架在此基础上可以添加命名空间的映射,实现根据命名空间加载对应目录的工作。 1.命名空间到底解决了什么问题? PHP在5.3.0入了namespace关键字以及__NAMESPACE__魔术常量,命名空间的作用是为了解决重...
摘要:类与对象基本概念如果在之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。如果一个类被声明为,则不能被继承。命名空间通过关键字来声明。 类与对象 基本概念 new:如果在 new 之后跟着的是一个包含有类名的字符串,则该类的一个实例被创建。如果该类属于一个名字空间,则必须使用其完整名称。 Example #3 创建一个实例 ...
摘要:前言在开始之前,欢迎关注我自己的博客这篇文章是对自动加载功能的一个总结,内容涉及的自动加载功能的命名空间的与标准等内容。要实现第一步,第二步的功能,必须在开发时约定类名与磁盘文件的映射方法,只有这样我们才能根据类名找到它对应的磁盘文件。 前言 在开始之前,欢迎关注我自己的博客:www.leoyang90.cn 这篇文章是对PHP自动加载功能的一个总结,内容涉及PHP的自动加载功能、P...
阅读 2814·2021-11-18 10:02
阅读 3671·2021-11-15 17:59
阅读 2305·2021-09-06 15:00
阅读 3342·2019-08-29 16:58
阅读 1054·2019-08-26 10:34
阅读 1580·2019-08-26 10:15
阅读 1284·2019-08-26 10:11
阅读 2713·2019-08-23 18:33