我在PHP中进行函数式编程的尝试

2021-02-21 08:02:28

PHP是我学到的我的第一语言之一。即便如此,这历史可以追溯到10年,我仍然在工作中使用PHP。但是,与此同时,我也学到了许多其他语言,如Java,Clojure,Scala,Python,JavaScript和方案。通过学习所有语言及其概念,功能性编程的概念始终是我最喜欢的,所以我试图使我的PHP编程风格更加功能。在以下文章中,您可以阅读我尝试过的一些方法。

但是,您在功能编程中最常见的事情之一是将函数作为参数传递给另一个函数。如果您尝试过,PHP将使用错误消息响应您。

PHP对此没有直接支持。要解决问题,我们必须将符号才能转换为字符串。

一种更常见的方法是为每个函数定义常量,并使用常量作为参数到该功能。

<?phpfunction inc($ number){返回$ walue + 1;} const inc =&#39 ;; $ x = [1,2,3,4]; array_map(inc,$ x);

这种方法的缺点是,重构更具挑战性,并且缺少恒定定义的机会非常高。

功能编程中的另一个常见概念是将一组函数组分组到模块中的可能性。模块可以具有一些公共可访问功能以及外部世界无法访问的一些私有功能。在PHP中,这可以通过仅使用静态成员创建类来完成。

<?phpclass MyStaticModule {私有静态函数add($ a,$ b){return $ a + $ b; }公共静态函数inc($ number){返回self :: add($ number,1); }}

这种方法为我们提供了模块化方面的所有灵活性。但是,尚未解决将函数作为另一个函数的参数传递的问题。

<?phpclass MyProgram {使用MyTraitModule; //在此处使用其他特征公共函数main(){return $ this-> inc($ number); }}

这种方法的好处是我们可以解决第一个问题。因此,我们只需要定义魔术方法__get。

<?phptrait FPMagic {公共函数__get($ name){如果(method_exists($ this,$ name)){return [$ this,$ name]; // //可以调用} else {抛出新\ Exception('方法不存在:'。$ name); }}}类MyProgram {使用FPMagic;使用MyTraitModule;公共功能main(){$ x = [1,2,3,4];返回array_map($ this-> inc,$ x); //使用魔术方法__get}}

这种方法的一个很大的缺点是,我们必须自己解决所有冲突的函数名称。不仅适用于公共方法,而且适用于私有方法。如果程序增长,这几乎是不可能的。

类模块方法和特征模块方法的结合将是开始使用PHP进行函数式编程的一个很好的解决方案。但是,魔术方法_get的技巧不能用于类模块方法,因为PHP没有静态属性的魔术方法。

最后一种选择是使用一种功能强大且可编译为PHP的语言。 近年来,对此进行了一些尝试(例如Haxe和Pharen)。 尽管Pharen看起来非常有前途,但几年来它尚未见过任何提交,并且仍基于PHP 5。 由于我没有找到解决该问题的好方法,因此我利用我的冠状病毒业余时间自己解决了这个问题。 这就是Phel。 Phel是一种可编译为PHP的功能性编程语言。 它是受Clojure和Janet启发的Lisp方言。 虽然Phel的状态目前为Alpha,但还算完整。 如果要尝试,请继续阅读入门指南。 我正在寻找您的反馈。