【问题标题】:PHP's current() & key() functions; inconsistent with function signaturePHP 的 current() & key() 函数;与函数签名不一致
【发布时间】:2011-10-22 23:17:19
【问题描述】:

我注意到 PHP 的 current()key() 数组函数(与其他数组指针函数一样)通过引用获取数组参数:

混合当前(数组&$array
每个数组都有一个指向其“当前”元素的内部指针,该元素被初始化为插入到数组中的第一个元素。

经过几次快速检查,current()key()与其他数组指针函数不同)似乎都按值接受数组参数,因此在传递函数的返回值。

我的结论是,这仅仅是因为 current()key() 不尝试移动数组指针,因此不需要通过引用传递参数(或者在一些透明、安静的情况下这样做,隐秘的方式)。不过,这让我有点担心。

谁能确认这是否是预期的功能?我很乐意用它来获取返回数组的第一个元素/键,但 PHP 在几乎任何其他情况下允许发生致命错误(或严格标准警告 ) 用于将值传递给按引用参数。

功能还是错误?


例如:

error_reporting(-1);

function getArray(){
    return array('a', 'b', 'c');
}

var_dump( current(getArray()) );
var_dump( key(getArray())     );
var_dump( next(getArray())    );
var_dump( prev(getArray())    );
var_dump( reset(getArray())   );
var_dump( end(getArray())     );

结果:

string(1) "a"

int(0)

Strict standards: Only variables should be passed by reference ...
string(1) "b"

Strict standards: Only variables should be passed by reference ...
bool(false)

Strict standards: Only variables should be passed by reference ...
string(1) "a"

Strict standards: Only variables should be passed by reference ...
string(1) "c"

【问题讨论】:

  • @ajreal - 不,第一个 array 只是一个类型提示。请参阅php.net/manual/en/function.array-intersect-key.php 进行比较。
  • @ajreal - 也许我不明白,但array &$array 参数列表(据我所知)通过引用指示所需的数组。跨度>

标签: php arrays reference pass-by-reference


【解决方案1】:

这绝对是一个功能,我不想没有它。

现在的问题是关于& 的文档是否正确。

代码

当前

PHP_FUNCTION(current)
{
    HashTable *array;
    zval **entry;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &array) == FAILURE) {
        return;
    }

    if (zend_hash_get_current_data(array, (void **) &entry) == FAILURE) {
        RETURN_FALSE;
    }
    RETURN_ZVAL(*entry, 1, 0);
}

下一个

PHP_FUNCTION(next)
{
    HashTable *array;
    zval **entry;

    if (zend_parse_parameters(ZEND_NUM_ARGS() TSRMLS_CC, "H", &array) == FAILURE) {
        return;
    }

    zend_hash_move_forward(array);

    if (return_value_used) {
        if (zend_hash_get_current_data(array, (void **) &entry) == FAILURE) {
            RETURN_FALSE;
        }

        RETURN_ZVAL(*entry, 1, 0);
    }
}

结论

文档是正确的 - 在两种情况下都将数组作为参考。

不知道为什么 on 会引发错误,而另一个则不会。

顺便说一句,错误被抛出

  • Zend/zend_vm_def.h
  • Zend/zend_vm_execute.h

【讨论】:

  • 谢谢@cweiske - 这不是我想要的。我没有通过引用明确地传递参数。为清楚起见,我将进行编辑,请稍后检查。
  • 谢谢@cweiske - 这很奇怪(我得出类似的结论,只是在将巨大的哈希映射传递给current() 时观察了PHP 的内存分配;它没有加倍)多么奇特。我要归档一些东西。文档中的错误,或诸如此类的错误。再次感谢 cweiske,感谢您的帮助和坚持。
  • 这个答案并不完全正确。显示的代码与参考无关。引用在相应函数的 arginfo 结构中处理。例如。 for current(): lxr.php.net/xref/PHP_TRUNK/ext/standard/basic_functions.c#291 如您所见,它使用 PREFER_REF,因此如果可以,它将表现为引用-y,但也接受非引用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-02-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-05-16
相关资源
最近更新 更多