2016-09-15 15 views
3
<?php 
function sum($y) { 
$y = $y + 5; 
} 

$x = 5; 
sum($x); 
echo $x; 
?> 

だから私はこのコードを持っています。質問は次のとおりです。答え:5.どのようにして10を出力するのですか?答え:sum(& $ x)。参照渡しと値渡し

問題は私が最初の質問に対する答えが5である理由を理解できないことです。あなたがsum($ x)を作成すると、その関数を$ xと置き換えるべきではないので、$ x = 5 + 5 = 10?なぜ答えは5ですか?私は本当に理解していない。誰かが私にポインタと住所に関するものを説明してくれましたが、私は理解しませんでした。私はポインタの概念を理解していない、私はそれをgoogledと明らかにPHPのポインタがないので、私は非常に混乱している。私の友人は、変数は値で構成され、その値のメモリアドレスは、誰かが私が5歳で、答えが5で10ではないように私を説明することはできますか?してください

+0

'の値$ X + 5'' $のX 'に戻されていません'$ y'には' sum($ y) '関数のスコープ内にしか存在しません。 – x13

+0

しかし、なぜそれが起こるのですか?私は私の質問が本当にばかだと知っています。つまり、sum($ x)は$ x = $ x + 5ではないのですか?なぜそれは$ yに戻されますか? sum($ x)は、$ yを$ xに置き換えることを意味しませんか? –

+2

デフォルトでは 'sum($ y)'関数で使用する '$ y'という' $ x'の 'duplicate'を作成します。この時点で '$ x'と' $ y'は何も関係がありません。偶然)彼らの価値。 '$ y'は5だけ増加しますが、' $ x'はどこにも言及されていません。この 'sum(&$ y)'としてパラメータリストに '$ y'を入れると、新しい複製を作成するのではなく、' $ x'を参照します。ポストイットに誰かの電話番号を書き留めることと、電話番号を見つけることができるポストイットに書き込むことの違いです。 – x13

答えて

7

$x5と書かれています。

ここ
function sum($y) { 
    $y = $y + 5; 
} 

$yは、あなたが書かれているもののです。そのような値に5を加えても、その音符はそのまま残されます。参照演算子(&$y)で

function sum(&$y) { 
    $y = $y + 5; 
} 

、あなたは関数に非常に紙を渡し、それに書かれているものが上書きされます。


番号などのプリミティブ値の場合

、私は気にしないだろうといつもreturn値は、あなたがしたい:

function valuePlusFive($x) { 
    return $x + 5; 
} 

$x = 5; 
$x = valuePlusFive($x); 
+1

ELI5の確認済みの回答、私はそれが好き – Neat

+0

今、あなたと2番目のコメントが本当に私を理解させてくれた、ありがとう! –

5

これは、ビューの理論の観点から非常に良い説明はありませんが、これはあなたが概念を理解する必要がありますあなたはこのように関数を宣言し、それを呼び出す

function ($argument) {...} 

あなたが渡す引数は値渡しです。これは、あなたが渡した引数のコピーで作業する関数の範囲内にあることを意味します。関数が呼び出される前に、引数のコピーが作成され、関数内でコピーを処理していて、元のままであることは想像できます。関数が終了するとコピーは、あなたがこのようにそれを宣言しかしときもう

ではありません:あなたはあなたが渡されてきた変数と直接作業していることを意味し、参照によって引数を渡している

function (&$argument) {...} 

。この場合、コピーは作成されず、引数を1つの場所から取り出し、関数の中に入れて変更しました。

+1

私はそれがコピーで動作しているのか分からなかった。ありがとう! –

3

PHPでは、「変数のスコープは、変数が定義されているコンテキストです。」 (according to the docs)。関数の内部では、$y(渡された値のコピー)が操作されていますが、関数によって返されません。したがって、関数が終了すると、その値は関数の外部ではアクセスできなくなります。

あなたは(Cでのポインタと同様に)pass the variable in by referenceにしたいなら、あなたはそうのような&を追加することができます:あなたは、このコードを呼び出すとき

function sum(&$y) { 
    $y = $y + 5; 
} 

:今すぐ

$x = 5; 
sum($x); 
echo $x; 

を、それが出力します10.これを行うより良い方法は、関数から値を返すことで、その値を出力することです。

function sum($y) { 
    return $y + 5; 
} 

$x = 5; 
echo sum($x);