2

これは一種の初心者の質問であることは知っていますが、誰かがこの機能で何が起こっているのか説明してもらえますか?

// Prints "hello mutated world" 
function mutator($args = null) { 
    $n = count($args); 
    while($i<$n) $args[$i++] = "mutated"; 
} 
$a = "hello"; 
$b = "strange"; 
$c = "world"; 
mutator(array($a, &$b, $c)); 
echo "$a $b $c"; 

$i具体的には、との値は何$nですか? どういう$args = null意味ですか? while ループにどのように収まりますか?

4

2 に答える 2

0

この関数mutatorは配列を受け取り、その本体内で配列の各要素を文字列 "mutated" に変更し、何も返しません。通常、その関数のコンテキストの外側に渡された配列には何の影響もありませんmutator。実際、関数が何かを実行したかどうかは明らかではありません。ただし、要素$bは参照 ( ) によって渡されるため&$b、関数は要素を変更できます。そのため、コードは「hello Mutated world」と出力します。

$n$n=count($args);変数の要素数を返すステートメントによって設定されます。$args

$iはwhileループ ( $i++.)$n内でインクリメントされる変数です。$args($i<$n)$args

$args=null関数定義では、関数が引数なしで呼び出された場合に使用する null のデフォルト値を提供するだけです。


数年後にこの回答を再検討すると、追加したいことがいくつかあります。この関数は、関数の引数として参照を配列で渡すことの効果を説明することを意図しているだけだと理解していますが、うまく構築された PHP 関数ではありません。例は、それがどのように機能するかについていくつかの疑問を持っていたでしょう.

定義は、引数が配列であることを期待していることをより明確にする必要があり、デフォルト値は ではなく空の配列である必要がありますnull。PHP の新しいバージョンでは、nullは数えられず、引数なしで呼び出された場合、関数は警告を引き起こします。PHP 7.1 以降では、何も返さないことも示せます。

function mutator(array $args = []): void { ...

また、$iwhile ループで使用される前は未定義です。ループの最初の反復では、 でインクリメントされるまで null になる++ため、値が になる0ことはなく、最初の配列要素にアクセスしません。最初の要素を参照として渡すことでも確認できます。変異することはありません。$iループの前にゼロに初期化するか、for代わりにループを使用する必要があります。

for ($i = 0, $n = count($args); $i < $n; $i++) {
    $args[$i] = 'mutated';
}

この方法$iは定義されているため、未定義の変数の通知はなく、 の最初の要素にアクセスでき、$args何が起こっているのかがより明確になることを願っています。(ただし、これは5年後のOPにはそれほど役に立たないと思います。)

于 2013-10-25T22:39:20.857 に答える
-1

func_*_args()関数を使用します。

function a() {
    if (func_num_args() > 0) {
        foreach (func_get_args() as $arg) {
            var_dump($arg);
        }
    }
}

それで:

a('one', 'two', 'three', 'and so on...');
于 2013-10-25T21:32:07.030 に答える