我在C中有一些代码可以进行一些硬件访问。此代码已准备就绪并经过充分测试。现在我想实现一个用于控制这个硬件的Web界面。所以我使用Zephir进行了PHP扩展开发。
我的问题是,“Zephir是否可以包含一个外部库resp。反对它?“如果有可能,我该怎么做?
答案 0 :(得分:7)
是的,这是可能的,有两种方法可以使用C代码。
将C代码包装在CBLOCK中
您可以在代码中嵌入c代码,例如:%{ // c-code }%
。
此功能未记录,但存在于测试中。
https://github.com/phalcon/zephir/blob/master/test/cblock.zep https://github.com/phalcon/zephir/blob/c47ebdb71b18f7d8b182f4da4a9c77f734ee9a71/test/cblock.zep#L16 https://github.com/phalcon/zephir/blob/c47ebdb71b18f7d8b182f4da4a9c77f734ee9a71/ext/test/cblock.c
%{
// include a header
#include "headers/functions.h"
// c implementation of fibonacci
static long fibonacci(long n) {
if (n < 2) return n;
else return fibonacci(n - 2) + fibonacci(n - 1);
}
}%
看起来有点难看,但有效,)更优雅,但也更多的工作,是自定义优化器:
撰写自定义优化工具
'optimizer'就像函数调用的拦截器一样。一个 'optimizer'替换PHP用户空间中函数的调用 直接C调用更快,开销更低 性能
可以编写一个带有干净接口的优化器,允许Zephir知道传递给C函数的参数类型和返回的数据类型。
手动:https://docs.zephir-lang.com/en/latest/optimizers.html
示例(调用斐波那契c-func):https://github.com/phalcon/zephir/pull/21#issuecomment-26178522