对于那些想知道名称空间功能的人,这里有一些解决方案尝试,没有 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
希望这有助于为那些接触命名空间的人提供一些解决方案。