好吧,我对PHP编程比较陌生,并且一直在不知不觉中有可能实际使用PHP中的命名空间,因为我可以在c#等.
它真的很难看,因为他们已经决定使用反斜杠 - 为什么!?
无论如何,我对其他PHP程序员关于命名空间是否会在PHP中流行以及我是否应该立即开始使用它们的观点感兴趣?
以下是那些想知道名称空间功能的人的一些解决方案尝试,没有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()
笔记
call_user_func('photopluginlib::functionname'),需要使用call_user_func(Array('photopluginlib','functionname'))或者在class里面call_user_func(Array(__CLASS__,'functionname')),这意味着代码重写为wp add_action,preg_replace_callback等.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
希望这有助于为那些达到名称空间的人提供一些解决方案.
它的使用已经开始流行起来.有几个项目在即将推出的/ beta版本中使用它.然而,我见过的大多数例子都像货物崇拜一样使用它.例如,Doctrine2使用五个或更多嵌套命名空间(代码味道),可能提供命名空间/类到文件系统/目录的1:1映射.我想新颖性使PHP名称空间容易过度使用.
无论如何,语法对可读性没有多大帮助.对于专业程序员来说,这是一个很大的转折点.但是如果你的项目中有一个严重的用例,那就去吧.(假设命名冲突不是最好的原因.)
在核心开始使用它们之前,它们很可能不会流行起来(在 PHP 7 中,也许可能......),但是使用 Python 几个月会告诉你命名空间是很棒的。