Raspberry Pi 用の SPI 拡張機能を作成していますが、追加しようとしているクラス関数で奇妙な問題が発生しました。(私が見逃している明らかなものを確認したい場合は、レポがここにあります: Github の php_spi )
私の 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 エラーが表示されます。何が欠けている可能性がありますか?
(明確にするために、これはこの1つの機能を除いて機能する拡張機能です)
編集: 1 年以上前の質問に反対票を投じていただきありがとうございます。