5

The function signature on PHP.net for array_replace() says that the arrays will be passed in by reference. What would be the reason(s)/benefit(s) to doing it this way rather than by value since to get the intended result you must return the finished array to a variable. Just to be clear, I am able to reproduce the results in the manual, so this is not a question on how to use this function.

Here is the function signature and an example, both from php.net.

Source: http://ca3.php.net/manual/en/function.array-replace.php

Function signature:

array array_replace ( array &$array , array &$array1 [, array &$... ] )

Example code:

$base = array("orange", "banana", "apple", "raspberry");
$replacements = array(0 => "pineapple", 4 => "cherry");
$replacements2 = array(0 => "grape");

$basket = array_replace($base, $replacements, $replacements2);
print_r($basket);

The above example will output:

Array
(
    [0] => grape
    [1] => banana
    [2] => apple
    [3] => raspberry
    [4] => cherry
)
4

4 に答える 4

4

php_array_merge_or_replace_wrapperを呼び出すこの関数は、 zend_hash_mergeを呼び出し、それが_zend_hash_mergeなどを呼び出します。これは、最終的に配列が参照によってPHP に渡される理由である可能性があります(配列が必要なため)。array_replace()memcmp()

配列は PHP の機能の 1 つであり、機能しているように見えてほとんど質問されません。少し掘り下げてみると、その理由がわかります。

于 2012-06-22T14:22:34.273 に答える
3

ポイントは、_zend_hash_merge関数が array_merge だけでなく演算子+ (両方のオペランドが配列の場合) によっても使用されることです。

処理にはいくつかの違いがありますが、実際には要件の違いに起因するものはありません。私の知る限り、誰も と書い+てい&$arr + &$arrません。

したがって、それはドキュメントの単なるエラーだと思います。

しかし、PHP 内部コードの深淵を分析しなくても、この結論に達することができます。&$array)変更可能な (そしておそらく変更される) 配列を渡すときは、記法を使用することを思い出してください。たとえば、 array_splice()シグネチャを参照してください。そして (これは非常に簡単に確認できます)array_replace引数を変更しません - 少なくとも現在のところ。)

更新:まあ、今私は怒っています。一部の PHP 開発者 (神のご加護がありますように) が実際にドキュメントのバグではないと考えている場合は、その理由を説明させてください。

array_pop(array('a' => 1));

... 致命的なエラー ( Only variables can be passed by reference) が発生し、これが...

array_replace(array('a' => 1), array('b' => 2));

...何も起こらなかったので、うまくいきます。

それとも、現在 PHP には 2 種類の参照がありますか?

于 2012-06-22T14:38:25.403 に答える
1

これはドキュメントのバグであり、現在は修正されています。

https://bugs.php.net/bug.php?id=62383

于 2012-06-24T17:49:09.413 に答える