传递一个php7数组值作为参考

时间:2017-01-28 22:05:06

标签: php

我在这个网站上发现了一条注释,它非常有助于将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级别查看内容以便在网页中显示。除了演示文稿部分,我可以完全了解。

0 个答案:

没有答案