导航:首页 > 编程语言 > php命名空间冲突

php命名空间冲突

发布时间:2023-09-01 06:09:15

A. 介绍一下php的命名空间!php那个版本以上支持命名空间

1.介绍一下php的命名空间

什么是命名空间?从广义上来说,命名空间是一种封装事物的方法。在很多地方都可以见到这种抽象概念。例如,在操作系统中目录用来将相关文件分组,对于目录中的文件来说,它就扮演了命名空间的角色。具体举个例子,文件 foo.txt 可以同时在目录/home/greg 和 /home/other 中存在,但在同一个目录中不能存在两个 foo.txt 文件。另外,在目录 /home/greg 外访问 foo.txt 文件时,我们必须将目录名以及目录分隔符放在文件名之前得到 /home/greg/foo.txt。这个原理应用到程序设计领域就是命名空间的概念。
在PHP中,命名空间用来解决在编写类库或应用程序时创建可重用的代码如类或函数时碰到的两类问题:
用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。
为很长的标识符名称(通常是为了缓解第一类问题而定义的)创建一个别名(或简短)的名称,提高源代码的可读性。
PHP 命名空间提供了一种将相关的类、函数和常量组合到一起的途径。

2.php那个版本以上支持命名空间?

PHP 在 5.3.0 以后的版本开始支持命名空间。

B. 简评用PHP开发大型系统的缺点

笔者在过去的四年里一直致力于PHP应用的开发 PHP确实十分容易编写 但是PHP也有一些十分严重的缺陷

下面笔者会给出自己的理由 为什么PHP不适合于比小型业余网站更大的网站

对递归的不良支持

递归是一种函数调用自身的机制 这是一种强大的特性可以把某些复杂的东西变得很简单 有一个使用递归的例子是快速排序(quicksort) 不幸的是 PHP并不擅长递归 Zeev 一个PHP开发人员 说道 PHP (Zend)对密集数据使用了栈方式 而不是使用堆方式 也就是说它能容忍的递归函数的数量限制和其他语言比起来明显少 见bug 这是一个很不好的借口 每一个编程语言都应该提供良好的递归支持

许多PHP模块都不是线程安全的

在几年前 Apache发布了Web服务器的 版 这个版本支持多线程模式 在这个模式下 软件一个一部分可以同时运行多个 PHP的发明者说PHP的核心是线程安全的 但是非核心模块不一定是 但是十次有九次 你想要在PHP脚本中使用这种模块 但这又使你的脚本不能合适Apache的多线程模式 这也是为什么PHP小组不推荐在Apache 的多线程模式下运行PHP 不良的多线程模式支持使PHP常被认为是Apache 依然不流行的原因之一

PHP 由于商业原因而不健全

通过使用缓存 PHP的性能可以陡增 %[见基准测试] 那么为什么缓存没有被构建在PHP中呢?因为Zend——PHP的制造者 它在销售自己的Zend Accelerator 所以当然 他们不想抛弃自己的商业产品这块肥肉

但是有另一个可选择的 APC (Zend后来推出Zend Optimizer 免费的加速器——译者)

没有命名空间

设想某个人制作了一个PHP模块用来阅读文件 模块中一个函数叫做read 然后另一个人的模块可以读取网页的 同样包含一个函数read 然后我们就无法同时使用这两个模块了 因为PHP不知道你要用哪个函数

但是有一个很简单的解决方法 那就是命名空间 曾经有人建议PHP 加入这个特性 但不幸得是他没有这么做 现在 没有命名空间 每个函数都必须加上模块名作为前缀 来避免名称冲突 这导致了函数名恐怖得长 例如xsl_xsltprocessor_transform_to_xml让代码难于书写和理解

不标准的日期格式字符

很多敏敏程序员对 日期格式字符 都很熟悉 它是从UNIX和氏握C语言中来的 其他一些编程语言采用了这个标准 但是很奇怪的 PHP有它自己的一套完全不兼容的日期格式字符 在C中 %j 表示一年中的当天 在PHP中他表示一个月中的当天 然而使事情更混乱的是 Smarty (一个很流行的PHP模版引擎)的 strftime 函数和 date_format 函数 却使用了C/UNIX的格式化字符

混乱的许可证

你也许认为PHP是免费的 所有的在手册中提到的PHP模块也是免费的 错了!例如 如果你想在PHP中生成PDF文件 你会在手册中发现两个模块 PDF 和 ClibPDF 但是这两个都是有商业许可证的 所以 你所使用的每个模块 你都要确保你同意他的许可证

不一致的函数命名规则

有些函数名称是有多个单词组成的 一般有三种单词歼拿庆组合的习惯

直接拼接 getnumberoffiles 用下划线分开 get_number_of_files 骆驼法则 getNumberOfFiles 大部分语言选择其中一中 但是PHP都用到了

例如 你想要把一些特殊字符转换成HTML实体 你会使用函数entities (直接拼接单词) 如果你要使用相反的功能 你要用到它的小弟弟_entity_decode 由于某些特殊的原因 这个函数名是由下划线分隔单词 怎么能这样呢?你知道有一个函数叫strpad 或者他是str_pad?每次你都要查看一下到底这个符号是什么或者直接等他出现一个错误 函数是不分大小写的 所以对于PHP来说rawurldecode 和RawUrlDecode之间没有什么区别 这也很糟糕 因为两个都使用到了同时他们看上去还不一样 混淆了阅读者

魔法引用的地狱

魔法引用(Magic quote)可以保护PHP脚本免受SQL注入攻击 这很好 但是出于某些原因 你可以在php ini中关闭这个配置 所以你如果要写出一个有弹性的脚本 你总要检查魔法引用是开启还是关闭 这样一个 特性 应该让编程更简单 而事实上变得更复杂了

缺少标准框架

一个成长中的网站没有一个整体框架 最终会变成维护的噩梦 一个框架可以让很多工作变得简单 现在最流行的框架模型时MVC 模型 在其中表现层 业务逻辑和数据库访问都分离开了

很多PHP网站不使用MVC 模型 他们甚至没有一个框架 甚至现在有一些PHP框架同时你都可以自己写一个 关于PHP的文章和手册没有提高框架的一个字 同时JSP 开发人员使用像Struts的框架 ASP开发人员使用 Net 看起来好像这些概念都广泛被PHP开发人员所了解 这就说明了PHP实际上到底是多专业

总结

什么问题?

对于非常小的项目 它可以是一个十分符合人意的编程语言 但是对于较大的和更为复杂的项目 PHP就显出他的薄弱了 当你不断地摸索之后 你会发现笔者提到的某些问题的解决方案 所以 当解决方案已知之后 为什么不能修正他呢?另外为什么这些修补不在手册中提到呢?

一个开源的语言十分流行是一件好事 但不幸得是 它不是一个伟大的语言 笔者希望所有的问题能有一天得到解决(也许在PHP ?) 然后我们就将拥有一个开源语言 他既开源 又好用

lishixin/Article/program/PHP/201311/21478

C. php命名空间没有autoload能用么

能用。

__autoload 是当前需要使用的类没有引入时,在PHP抛出错误前被触发,未定义的类名会被当作参数传入。
命名空间主要是为了解决命名冲突问题。单独使用命名空间只是让类名增加前缀,不发生冲突,系统并不会进行自动导入类。
只要你已经通过include等导入了类,就可以不使用autoload。

D. php7使用use引入命名空间提示语法错误

我也遇到了这个问题,我是这样解决的,我服务器装了5.2和7.2两个版本,可能两者有冲突,5.2不支持命名空间,不支持use和namespace,解决办法就是卸载5.2版本!!!

E. PHP 5.3 特性:命名空间

PHP 的一个新的重要特性就是 命名空间(namespace) 这一特性在 PHP x 时候就提出过 后来被取消并安排在 PHP 中实现 而此次又再次 提前 到了 PHP 发布 可见开发人员对其的重视以及谨慎的态度

官方发迹扰粗布时说明文档的内容可能已过期(documentation maybe out dated) 所以在这里简单的说明命名空间的用法 首先是声明一个命名空间 加入了新的关键字 namespace 其应在类文件的开头

<?php namespace Project::Mole; class User { const STATUS_OK = true; function register($data) { } } ?>

然后在控制器中(可能是其他文件)就可以这样调用

$user = new Project::Mole::User(); $user >register($register_info);

的确与平常的并无两样 但是我们可以将两个相互独立的类联系李逗起来 比如

Project::Mole::User; Project::Mole::Blog;

这样就能从语言本身更容易描述和理解变量 类之间的关系 从而避免了 传统 上的 Project_Mole_Blog 这样冗长的命名方式 上面的说明可能很难说明使用命名空间带来了什么好处 新增加的 use 和 as 关键字或许能更好的说明问题 use 和 as 语句可以引用和声明 命名空间的 别名 比如 上述的控制器中实例化类的代码可以这样写

use Project::Mole; $user = new Mole::User(); $user >register($register_info);

甚至

use Project::Mole::User as MoleUser; $user = new MoleUser; $user >register($register_info);

类中的常量也可以通过命名空间访问 比如上述类中的 STATUS_OK 就可以通过命名空间

Project::Mole::User::STATUS_OK

访问 进一步的 也可以用别名简化那么长的 变量名称

use Project::Mole::User::STATUS_OK as STATUS_OK; echo STATUS_OK;

顺便提下 超空间(The Global Namespace) 的概念 所谓的 超空间 就是没有指定命名空间的变量 类和函数 比如

function foo() { }

这的姿镇函数 可以使用 foo() 执行的同时 也可以使用 ::foo(); 这样执行

最后 配合使用 autoload 函数即可载入指定命名空间的类 简单的函数如下

function __autoload( $classname ) { $classname = strtolower( $classname ); $classname = str_replace( :: DIRECTORY_SEPARATOR $classname ); require_once( dirname( __FILE__ ) / $classname class php ); }

这样 比如调用

__autoload( Project::Mole::User );

lishixin/Article/program/PHP/201311/21303

F. PHP中不同文件夹使用相同的命名空间,相互之间应该如何调用呢能不能举例说明一下。

那么在不同文件中晌袭命名相同的命名空间就表示在一个容器下...不过在不同目录下相同的命名空间我还不是太清楚.一般都是在一个项目文件下的...我去找找有答案在添激卜加宴铅兄

命名空间可以解决下面两个问题:

(1)用户编写的代码与PHP内部的类/函数/常量或第三方类/函数/常量之间的名字冲突。

(2)为很长的标识符创建一个别名,提高代码的可读性,减少代码的编写量。

G. php不同命名空间下不能使用include

php不同命名空间下不能使用include的原因是:php命名空间在第一个文件开关以namespace命名空间名,则当前的文件为该命名空间,当include其他文件的,其他文件的命名空间为文件的开头namespace名,如没有为全局,不因为include继承,查看当前文件的命名空间可用echo,NAMESPACE;php,include,文件位置,第一个include文件为最初文件位置,与当前文件无关,与加载的第一个文件有关。

阅读全文

与php命名空间冲突相关的资料

热点内容
Linux造成xfs文件夹 浏览:455
华为手机怎么修改wifi加密类型 浏览:248
服务器封口是什么意思 浏览:741
有限元分析是算法吗 浏览:901
空气压缩机性能曲线 浏览:20
京城程序员2019 浏览:403
android新系统 浏览:510
安卓80有什么bug 浏览:678
如何做单机服务器 浏览:943
校讯通查成绩怎么显示服务器异常 浏览:882
冰箱压缩机工作压力是多少 浏览:408
程序员20多平米租房 浏览:451
电工知识用线的算法 浏览:338
极光推送php服务器端 浏览:5
怎么用命令方块控制僵尸 浏览:774
大型云服务器有哪些 浏览:466
解压版三国街机 浏览:423
去中心化app里面包含什么 浏览:948
密钥安装命令行 浏览:505
文献编译英文 浏览:659