Jump to Navigation

functional

函数式编程

go实现gRPC的服务端的PHP扩展

go实现gRPC的服务端的PHP扩展

一种支持PHP语言编写gRPC服务端的方案

在有这个方案的想法时,并不确定技术上是否可行,只是觉得可行性程度挺高。

为了确认这可行性,先行做了些测试,所以先把技术点的可行性放在了文章的开头部分。

方案的设计将在总结可行性的基础上做详细说明,从本文的第二部分开始。

可行性验证

需要验证的主要有,

  • 从PHP调用go函数
  • 从go调用PHP函数
  • 把go代码编译为库
  • 把go库链接进PHP扩展
PHP调用go函数

上篇已经验证并实现。

用go实现PHP扩展

上篇已经验证并实现。

go调用PHP函数

如果需要go调用PHP函数,其实先要确定的是用C能够调用PHP函数。

好在我们有zend_API.h中的两个函数:

  • call_user_function
  • call_user_function_ex

而且比较成熟,不再多说明了。

rust实现继承

rust实现继承

目前找到两种方式 ,一种使用AsRef trait,一种使用Deref trait,都能实现单继承,而AsRef则能实现类似多继承的功能。

第一种,显式的.as_ref()

AsRef这是rust提供的一个trait,用来做类型的转换,例如,

impl AsRef for NButton { fn as_ref(&self) -> &NWidget { return &self.nbase; } }

其含义为,为NButton类型实现AsRef trait,可以把NButton类型引用转换为NWidget引用。

前提是NButton引用能在某处存放着一个nbase,如self.nbase。

有了这个trait实现之后,可以简单的方式实现类型转换了,

 btn.as_ref().callsth();

这个在使用上稍微有点不方便,需要显式地调用as_ref()方法。

多继承:

用rust语言实现C++的方法重载,overload

用rust语言实现C++的方法重载,overload

C++的重载方法,指的是方法名字相同,参数不同的一功能相似的方法。

一种重载是参数类型或者个数不同,但是返回值类型相同。 一种重载是参数类型或者个数不同,而且返回值类型也不同。

由于在rust语言中表达这两种方式有差别,所以区分开描述。

第一种情况,

假设C++类有如下方法,

class QString;

QString & QString::append(const QString & str); QString & QString::append(QChar ch);

这种代码在C++毫无违和感,语言级就支持,还比较好。

那么在rust实现同名的方法,显然不行的。

struct QString{};

PHP中的函数式编程特性分析

一、引言
在写此文时,想起之前看过的一句话,如果要学习一门新的语言,那么就学习一门能够改变你的思维方式的语言。
本着这句对我触动比较大的一句话,一直在关注着LISP/Scheme这类直接产生函数式编程方式的语言。
在这中间看过一些相关的资料,试着编写过一些代码,却一直停留在学习试验阶段,很难写出像样的可用程序来。

在最近几年中,又是一个计算机界推出新语言高潮。比较新的有Closure,Go等。
并且一些比较老的语言像C++,Python,Perl,发展变化的步伐也变大了。
在C++11中,也添加了匿名函数的支持。nodejs的javascript语言,更是标榜着“披着C语言外衣的LISP”。
从这些变化除了让程序更高效,功能更丰富全面外,也提供了大量使用函数式思维解决程序复杂度不断上升的问题的特性。

函数式思维系列

Subscribe to RSS - functional


Main menu 2

by Dr. Radut