到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)。