我在这个网站上发现了一条注释,它非常有助于将PHP5扩展转换为PHP7。我似乎陷入了另一个问题。
我在C扩展中有一个看起来像这样的函数
PHP_FUNCTION(GetSystemInformation)
{
struct dsiDeviceIdParams deviceParams[WS_MAX_STACKABLE_UNITS];
zval avar[WS_MAX_STACKABLE_UNITS];
int num, ret, i;
zval *adeviceParams;
zval *znumberOfElementsInList;
if(zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "a/z/",
&adeviceParams, &znumberOfElementsInList) == FAILURE)
{
return;
}
ret = dsiGetSystemInformation(deviceParams, &num);
if (WS_OK != ret)
{
RETURN_LONG(ret);
// i added these and the "a/z/" flags
zval_dtor(znumberOfElementsInList);
zval_dtor(adeviceParams); // i tried moving this to the end of the function too
znumberOfElementsInList->value.lval = num; // this value works! i can see it back on the webpage PHP
array_init(adeviceParams);
if (num > WS_MAX_STACKABLE_UNITS)
{
num = WS_MAX_STACKABLE_UNITS;
}
if (num > 0 && num <= WS_MAX_STACKABLE_UNITS)
{
for (i = 0; i < num; ++i)
{
//MAKE_STD_ZVAL(avar[i]);
array_init(&avar[i]);
sprintf(txt,"d1 %s\r\n",deviceParams[i].boxNumber); dump(txt);
add_assoc_long_ex(&avar[i], "boxNumber", sizeof("boxNumber"),
deviceParams[i].boxNumber);
sprintf(txt,"d2 %s\r\n",deviceParams[i].modelNumber); dump(txt);
local_add_assoc_string_ex(&avar[i], "modelNumber", sizeof("modelNumber"),
deviceParams[i].modelNumber, 1);
sprintf(txt,"d3 %s\r\n",deviceParams[i].versionNumber); dump(txt);
local_add_assoc_string_ex(&avar[i], "versionNumber", sizeof("versionNumber"),
deviceParams[i].versionNumber, 1);
sprintf(txt,"d4 %s\r\n",deviceParams[i].serialNumber); dump(txt);
local_add_assoc_string_ex(&avar[i], "serialNumber", sizeof("serialNumber"),
deviceParams[i].serialNumber, 1);
sprintf(txt,"d5 %d\r\n",deviceParams[i].numberOfPorts); dump(txt);
add_assoc_long_ex(&avar[i], "numberOfPorts", sizeof("numberOfPorts"),
deviceParams[i].numberOfPorts);
dump("D6\r\n");
add_next_index_zval(adeviceParams, &avar[i]);
dump("DE\r\n");
}
}
RETURN_LONG(ret);
}
在PHP中调用它
我为NumberOfElements正确地获取了值。 但是,deviceParams值为null / empty,它似乎无法找到任何数组字段
遇到PHP错误 严重性:注意 消息:未定义的索引:modelNumber 文件名:controllers / login.php 行号:158
如果我运行此行
debug_zval_dump($ deviceParams);
我可以看到内容(即型号/等)。
array(1) refcount(2){ [0]=> array(5) refcount(1){ ["boxNumber"]=> int(0) ["modelNumber"]=> string(9) "VS-1224-F" refcount(1) ["versionNumber"]=> string(12) "1.4.20160607" refcount(1) ["serialNumber"]=> string(8) "15090500" refcount(1) ["numberOfPorts"]=> int(24) } }
我确信这与引用指针/ etc有关,我还不确定如何解决这个问题。有人能指出我正确的方向吗?
基本上,我想将一个数组传递给我的C扩展,更改数组的内容(主要是填充它),然后在PHP级别查看内容以便在网页中显示。除了演示文稿部分,我可以完全了解。