到PHP命名空间或不到PHP命名空间

Dav*_*vid 35 php namespaces

好吧,我对PHP编程比较陌生,并且一直在不知不觉中有可能实际使用PHP中的命名空间,因为我可以在c#等.

它真的很难看,因为他们已经决定使用反斜杠 - 为什么!?

无论如何,我对其他PHP程序员关于命名空间是否会在PHP中流行以及我是否应该立即开始使用它们的观点感兴趣?

Joh*_*han 6

以下是那些想知道名称空间功能的人的一些解决方案尝试,没有php 5.3.

首先,我必须说,只有前缀为我工作,下面的其他解决方案是一些不这样做的说明.

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

解决方案1:使用plugin_name_namespace_为所有库函数添加前缀

 function str_len_utf8($str)
Run Code Online (Sandbox Code Playgroud)

 function photoplugin_str_len_utf8($str)
Run Code Online (Sandbox Code Playgroud)

只是找到 - 替换的问题.如果函数已经唯一地加上前缀,则很容易:

john_str_len_utf8() => photoplugin_john_str_len_utf8()
Run Code Online (Sandbox Code Playgroud)

对灵魂也有好处,支持自我,'johns字符串库':D

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

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

class photopluginlib
     {
     function str_len_utf8($a){ $a=$this->str_clean_utf8($a); ...}
     ...
     }
Run Code Online (Sandbox Code Playgroud)

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

$photopluginlib=new photopluginlibrary();
$b=$photopluginlib->str_len_utf8($a);
Run Code Online (Sandbox Code Playgroud)

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

class photopluginlib
     {
     static function str_len_utf8($a){ $a=self::str_clean_utf8($a); ...}
     ...
     }
Run Code Online (Sandbox Code Playgroud)

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

类中的所有函数调用都以self ::为前缀

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

$b=photopluginlib::str_len_utf8($a);
$c=photopluginlib::database_row(...)
Run Code Online (Sandbox Code Playgroud)

无需实例化该类.

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

笔记

  • 所有库都需要进入1个大型库类声明,你几乎无法在以后的PHP中向类中添加方法.
  • 你不能只是在不同的php文件中声明新的库函数.
  • 如果使用多个库,并且它们彼此使用,则需要使用self :: for function调用.
  • php5.2.17,common 2013,不接受call_user_func('photopluginlib::functionname'),需要使用call_user_func(Array('photopluginlib','functionname'))或者在class里面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);
Run Code Online (Sandbox Code Playgroud)

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

http://onlinephpfunctions.com/benchmarks

希望这有助于为那些达到名称空间的人提供一些解决方案.


mar*_*rio 5

它的使用已经开始流行起来.有几个项目在即将推出的/ beta版本中使用它.然而,我见过的大多数例子都像货物崇拜一样使用它.例如,Doctrine2使用五个或更多嵌套命名空间(代码味道),可能提供命名空间/类到文件系统/目录的1:1映射.我想新颖性使PHP名称空间容易过度使用.

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


Ign*_*ams 3

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

  • 我认为不会花那么长时间。主要框架已经开始向命名空间过渡。我想说,现在反对命名空间的主要论点(除了丑陋的反斜杠之外)是共享主机上缺乏 PHP 5.3 的可用性。 (5认同)