到 PHP 命名空间或不到 PHP 命名空间 [关闭]

Posted

技术标签:

【中文标题】到 PHP 命名空间或不到 PHP 命名空间 [关闭]【英文标题】:To PHP Namespace or not to PHP Namespace [closed] 【发布时间】:2011-03-03 17:57:38 【问题描述】:

好的,我对 php 编程比较陌生,一直在缓慢前进,完全没有意识到在 PHP 中可以像在 c# 等中那样实际使用命名空间。

这真的很丑,因为他们决定使用反斜杠 - 为什么!?

无论如何,我对其他 PHP 程序员对命名空间是否会在 PHP 中流行以及我现在是否应该开始使用它们的看法很感兴趣?

【问题讨论】:

(参考) Request for Comments: Namespace Separators @Gordon,他们认真考虑过笑脸吗?我知道 PHP 开发人员很疯狂,但真的吗? 在我看来,使用点进行连接是另一个糟糕的设计决策,它限制了该字符的更多逻辑用途,例如。 我不同意。使用+ 进行连接和加法的语言令人困惑。尤其是 javascript,它可能会改变你的类型。 出于一个蹩脚的原因,我正在避免使用 PHP 命名空间——我的 USB 键盘上的反斜杠键不起作用。 (我仍然可以俯身在笔记本电脑上按反斜杠,但这需要移动。)我希望他们使用:: 【参考方案1】:

对于那些想知道名称空间功能的人,这里有一些解决方案尝试,没有 php 5.3。

首先,我必须说,只有前缀对我有用,下面的其他解决方案是不那样做的注释。

例如,如果使用您在其中的有价值的函数库来生成 wordpress 插件,则可能需要命名空间功能。通常你不能有多个具有相同函数的函数声明的插件,这会导致致命错误。

解决方案 1: 在所有库函数前加上 plugin_name_namespace_

 function str_len_utf8($str)

变成

 function photoplugin_str_len_utf8($str)

只是查找替换的问题。如果函数已经具有唯一前缀,则很容易:

john_str_len_utf8() => photoplugin_john_str_len_utf8()

对灵魂也有好处,支持自我,'johns string library' :D

如果您选择具有一定常识的简短而漂亮的前缀,就像他们所说的那样,它就像一个魅力。

解决方案 2: 将所有库/重用函数包含在一个类中。

class photopluginlib
     
     function str_len_utf8($a) $a=$this->str_clean_utf8($a); ...
     ...
     

类中对类的所有函数调用都以$this->为前缀。一旦准备好这个类,就可以重复使用它而无需搜索替换,更改类名就足够了。用法:

$photopluginlib=new photopluginlibrary();
$b=$photopluginlib->str_len_utf8($a);

解决方案 3: 将所有库/重用函数包含在一个类中,并使用 :: 运算符

class photopluginlib
     
     static function str_len_utf8($a) $a=self::str_clean_utf8($a); ...
     ...
     

类中的所有函数声明在function前面都有关键字static

类内对类的所有函数调用都以self::

为前缀

一旦准备好这个类,就可以在没有搜索替换的情况下使用它。类名是命名空间,有点。一个只是改变类名并使用它。

$b=photopluginlib::str_len_utf8($a);
$c=photopluginlib::database_row(...)

无需实例化类。

看起来比 $photopluginlib->str_len_utf8() 好,但我还是更喜欢 photoplugin_john_str_len_utf8()

注意事项

所有库都需要进入 1 个大库类声明,您几乎无法在 php.ini 中稍后向类添加方法。 您不能只在不同的 php 文件中到处声明新的库函数。 如果使用多个库,并且它们正在相互使用,则需要使用 self:: 进行函数调用。 php5.2.17,通用2013,不接受call_user_func('photopluginlib::functionname'),需要使用call_user_func(Array('photopluginlib','functionname'))或者类内部,call_user_func(Array(__CLASS__,'functionname')),表示为wp add_action,preg_replace_callback等代码重写 需要php>=5 不能混合代码和函数声明,如:

class photopluginlib add_filter('html','myfilter'); static function myfilter($html)return ''

对于大代码,它很快就会变成一个大复杂的脑筋急转弯。

我更喜欢只使用前缀,直到真正的名称空间被广泛使用。

这些解决方案仍然意味着必须为所有功能使用添加前缀。命名空间功能意味着可以使用函数而不用前缀,前缀只有一次,在 php 文件的开头:

<?php
namespace photoplugin;
...
$b=str_len_utf8($a);

顺便说一句,升级到 php5.3 有一个额外的优势,如果您可以选择不为 php5.2 编写代码(仍然无处不在,2013 年)Php5.3 与 php 5.2.17 意味着即时速度提高。看起来可以提高 %30 等速度,不考虑数据库方面:

http://onlinephpfunctions.com/benchmarks

希望这有助于为那些接触命名空间的人提供一些解决方案。

【讨论】:

【参考方案2】:

它的使用已经流行起来。一些项目在他们即将推出的/beta 版本中使用它。然而,我见过的大多数例子都像货物崇拜一样使用它。例如,Doctrine2 使用五个或更多嵌套命名空间(代码异味),可能是为了提供命名空间/类到文件系统/目录的 1:1 映射。我猜这种新颖性使得 PHP 命名空间容易被无理过度使用。

无论如何,语法对可读性没有多大帮助。对于专业程序员来说,这是一个很大的转折点。但是,如果您的项目中有一个严重的用例,那就去做吧。 (假设的命名冲突不是最好的原因。)

【讨论】:

【参考方案3】:

在核心开始使用它们之前,它们很可能不会流行起来(在 PHP 7 中也许可能......),但是使用 Python 几个月会告诉你命名空间是 AWESOME

【讨论】:

我认为不会花那么长时间。主要框架已经过渡到命名空间。我想说现在反对命名空间的主要论点(除了反斜杠很丑)是共享主机上缺乏 PHP 5.3 的可用性。 @Gordon 我同意 5.3 在共享主机上的可用性——它非常烦人,是的,由于某种原因,反斜杠真的很难看。我一直在想为什么它如此丑陋,但我似乎无法确切地思考为什么——出于某种原因,它真的很糟糕。 @David:它已经在字符串中用于为某些字符赋予特殊含义或转义引号。我们不得不将它们翻倍这么久,以至于看到一个反斜杠会冒犯我们的感受。 是的,我知道你从哪里来 - 虽然它可能与所有其他基于 c 的语言有很大不同吗? PEAR2 编码标准也要求命名空间,因此要求最低版本为 5.3。 wiki.php.net/pear/rfc/pear2_standards【参考方案4】:

除非您的所有代码都在您自己的服务器上运行,否则现在开始使用它们还为时过早,因为 5.3 相对较新。

除此之外,我不确定他们是否会真正流行起来。即使是课程也需要很长时间才能赶上大部分 PHP 编程人群。

【讨论】:

您认为它不应该是应该使用的“最佳实践”吗? 我还不确定。我玩得还不够。不过从理论上讲,我会说是的,因为 PHP 迫切需要命名空间来阻止难以阅读的长函数名的泛滥。 5.3 于 2009 年 6 月发布。那是一年前的事了。确实“相对”新。 当您认为主机 /finally/ 现在远离 PHP4 时,它实际上是新生的。【参考方案5】:

我会尽快开始学习如何使用命名空间。 Zend Framework 2.0 将使用命名空间,这意味着任何使用 PHP 5.2 或更低版本的人都会倒霉。我使用虚拟专用服务器,所以我可以控制我的 PHP 版本。如果您使用 cPanel/WHM,您可以非常轻松地安装 PHP 5.3。如果您使用的是共享主机,可能需要一点时间才能看到 5.3 的安装,尽管那里有 5.3 的采用者。

【讨论】:

【参考方案6】:

PHP 不需要命名空间。

例如,在 C# 和 Java 中,通常使用多个库(特别是标准库),每个库都包含数千个类和每个库的定义。因此,发生冲突的可能性很高。

相反,在 PHP 中不同,我们不需要加载几个库,最多一个框架加上一些单独的 .php 文件。 PHP 的工作方式不鼓励加载最大的库,而是使用最少的库。这就是为什么名称冲突的可能性很小的原因。此外,框架可以使用短前缀,例如 Wp_User (Wordpress)。

【讨论】:

以上是关于到 PHP 命名空间或不到 PHP 命名空间 [关闭]的主要内容,如果未能解决你的问题,请参考以下文章

PHP命名空间

php命名空间

关于PHP命名空间的讨论

自定义作曲家命名空间找不到类

PHP命名空间

php命名空间