到PHP命名空间或不到PHP命名空间
好的,我对PHP编程相对来说比较陌生,一直在不知不觉中可以在C#中实际使用PHP中的命名空间。
这真的很难看,因为他们决定使用反斜杠 – 为什么?
无论如何,我感兴趣的其他PHP程序员的观点是否将命名空间在PHP中,以及我现在是否应该开始使用它们?
这里有一些解决scheme尝试那些想知道名称空间function,没有PHP 5.3。
首先,我必须说,只有前缀为我工作,下面的其他解决scheme是注意不要这样。
命名空间function可能是需要的,例如,如果一个人生产wordpress插件,使用你的价值函数库。 通常你不能有多个具有相同函数的函数声明的插件,它会导致致命的错误。
解决方法1:将所有库函数与plugin_name_或namespace_
function str_len_utf8($str)
变
function photoplugin_str_len_utf8($str)
只是查找replace的问题。 如果函数已经唯一地加上前缀,那么很简单:
john_str_len_utf8() => photoplugin_john_str_len_utf8()
对灵魂也有好处,支持自我,'johns string library':D
如果你用一些常识select简短而好的前缀,就像他们所说的那样,它就像一个魅力一样。
解决scheme2:将所有图书馆/再利用function封装在一个class级中。
class photopluginlib { function str_len_utf8($a){ $a=$this->str_clean_utf8($a); ...} ... }
类中的所有函数调用都以$ this->为前缀。 一旦这个类准备好了,可以不用searchreplace就重复使用它,改变类名就够了。 用法:
$photopluginlib=new photopluginlibrary(); $b=$photopluginlib->str_len_utf8($a);
解决scheme3:将所有库/ reeuse函数放在一个类中,并使用::运算符
class photopluginlib { static function str_len_utf8($a){ $a=self::str_clean_utf8($a); ...} ... }
类中的所有函数声明在函数前面都有关键字static 。
所有类中的函数调用都以self ::为前缀
一旦这个课程准备好了,就可以在没有searchreplace的情况下使用它。 类名是命名空间,sorting。 一个只改变类名,并使用它。
$b=photopluginlib::str_len_utf8($a); $c=photopluginlib::database_row(...)
不需要实例化类。
看起来比$ photopluginlib-> str_len_utf8()好 ,但我仍然更喜欢photoplugin_john_str_len_utf8()
笔记
- 所有的图书馆都需要进入一个大的图书馆类的声明,你实际上不能在PHP中添加方法。
- 你不能只是在不同的php文件中声明新的库函数。
- 如果使用多个库,并且它们正在使用对方,则需要使用self ::进行函数调用。
- php5.2.17,common 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 ''} }
- 对于大规模的代码,它可以很快成为一个复杂的大头脑。
我更喜欢使用前缀,直到真正的事物名称空间被广泛使用。
这些解决scheme仍然意味着必须在所有function用途前缀。 命名空间function意味着可以使用没有前缀的函数,在PHP文件的开始,前缀将只是一次。
<?php namespace photoplugin; ... $b=str_len_utf8($a);
顺便说一句,升级到php5.3有一个额外的好处,如果你可以select不编码为php5.2(仍然无处不在,2013年)PHP5.3与PHP 5.2.17意味着即时速度增加。 它看起来像%30等速度增加是可用的,不考虑数据库方面:
http://onlinephpfunctions.com/benchmarks
希望这有助于激发一些解决scheme,以达到名称空间。
它的使用已经在赶上。 几个项目在即将到来的/testing版本中使用它。 然而,我所看到的大多数例子都把它当作货物崇拜。 例如,Doctrine2使用五个或更多嵌套命名空间(代码异味),可能提供名称空间/类到文件系统/目录的1:1映射。 我想这个新颖的东西使得PHP的命名空间容易出现无用的过度使用。
无论如何,语法对可读性无帮助。 这对专业程序员来说是一个很大的转折。 但是,如果你的项目中有一个严重的用例,那就去做吧。 (假设的命名冲突不是最好的理由。)
直到核心开始使用它们(在PHP 7中,也许可能……),它们很可能不会被捕获,但是使用Python几个月将会告诉你命名空间是非常棒的 。
除非你所有的代码都在你自己的服务器上运行,否则现在开始使用它们还为时过早,因为5.3是相对较新的。
除此之外,我不确定他们是否真的能够赶上。 即使是上课,也需要很长时间才能赶上大部分PHP编程人群。
我将开始学习如何尽快使用命名空间。 Zend Framework 2.0将使用命名空间,这将意味着任何使用PHP 5.2或更低版本的人都将失去运气。 我使用虚拟专用服务器,所以我可以控制我的PHP版本。 如果你使用cPanel / WHM,你可以很容易地安装PHP 5.3。 如果您使用的是共享主机,则在安装5.3之前可能会有一点点,尽pipe这里有5.3个采用者。
命名空间不需要PHP。
例如,在C#和Java中,通常使用多个库(特别是标准库),每个库包含每个库的数千个类和定义。 所以,冲突的可能性很高。
相反,在PHP是不同的,我们不需要加载几个库,最多一个框架加上一些分离.php文件。 PHP如何工作阻止加载最大的库,但使用最低限度。 这就是为什么名称冲突的机会相当渺茫。 此外,框架经验丰富,使用短前缀,例如Wp_User(Wordpress)。