我正在为我的Raspberry Pi创建一个SPI扩展,并且遇到了一个我想要添加的类函数的一个相当奇怪的问题。 (如果你想检查我遗漏的任何明显的东西,那么回购就在这里:php_spi on Github)
在我的php_spi.h中,我定义了:
PHP_METHOD(Spi, blockTransfer);
#if (PHP_MAJOR_VERSION >= 5)
ZEND_BEGIN_ARG_INFO_EX(Spi__blockTransfer_args, ZEND_SEND_BY_VAL, ZEND_RETURN_VALUE, 1)
#if (PHP_MINOR_VERSION > 0)
ZEND_ARG_ARRAY_INFO(0, data, 1)
#else
ZEND_ARG_INFO(0, data)
#endif
ZEND_ARG_INFO(0, colDelay)
ZEND_ARG_INFO(0, discard)
ZEND_END_ARG_INFO()
#else /* PHP 4.x */
#define Spi__blockTransfer_args NULL
#endif
这是一些其他方法,类似地定义了当前可行的方法。在我的spi.c文件中,我的函数定义如下:
/* {{{ proto array blockTransfer(array data[, int colDelay[, bool discard]])
*/
PHP_METHOD(Spi, blockTransfer)
{
zend_class_entry * _this_ce;
zval * _this_zval = NULL;
zval * data = NULL;
HashTable * data_hash = NULL;
long colDelay = 1;
zend_bool discard = 0;
if (zend_parse_method_parameters(ZEND_NUM_ARGS() TSRMLS_CC, getThis(), "a|lb", &_this_zval, Spi_ce_ptr, &data, &colDelay, &discard) == FAILURE) {
return;
}
_this_ce = Z_OBJCE_P(_this_zval);
// some code
}
/* }}} blockTransfer */
我确保我的函数在函数列表中有一个条目:
static zend_function_entry Spi_methods[] = {
PHP_ME(Spi, __construct, Spi____construct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_CTOR)
PHP_ME(Spi, __destruct, Spi____destruct_args, /**/ZEND_ACC_PUBLIC | ZEND_ACC_DTOR)
PHP_ME(Spi, transfer, Spi__transfer_args, /**/ZEND_ACC_PUBLIC)
PHP_ME(Spi, blockTransfer, Spi__blockTransfer_args, /**/ZEND_ACC_PUBLIC)
PHP_ME(Spi, getInfo, Spi__getInfo_args, /**/ZEND_ACC_PUBLIC)
PHP_ME(Spi, setupTimer, Spi__setupTimer_args, /**/ZEND_ACC_PUBLIC)
PHP_ME(Spi, usecDelay, Spi__usecDelay_args, /**/ZEND_ACC_PUBLIC)
{ NULL, NULL, NULL }
};
代码编译干净,没有错误或警告,但是当我尝试测试函数时,我得到一个PHP错误,说明函数没有定义。我可能会错过什么?
(只是要清楚,这是一个有效的扩展,除了这一个功能)
编辑:感谢您对超过一年的问题进行投票。
答案 0 :(得分:0)
要检查的第一件事是PHP是否找到模块 - 尝试在命令行上运行php -m
或在网页中调用phpinfo()
- 是否列出了您的模块?
如果没有,请查看How to enable php extension using `phpize`?此外,您的环境是什么?
答案 1 :(得分:0)
您定义了数组Spi_methods
,但您没有引用它。它必须在模块结构中引用;例如,见this example。
您不需要将函数和arginfo原型放在主扩展头(或任何其他头)中,除非您需要引用其他编译单元中的符号,例如,如果您在一个文件中定义了一个函数,但在另一个中构建函数入口数组)。事实上,我认为它会自动包含在静态版本中,所以你不应该为了避免名字冲突。
答案 2 :(得分:0)
嗯,在我的测试文件中输入错误的时间浪费了很多:o(
我应该更仔细地阅读错误,因为它是关于未定义的函数blockTransfer(),而不是方法。
在测试文件中我有:
$read = $spi-blockTransfer();
卫生署!
抱歉浪费你的时间。