28110


> $GLOBALS["baz"] に再結合されるといったものになります。 $bar は関数 foo で利用できないため、  
>  リファレンス以外にはコール側の変数スコープにある $bar を何かに結合する手段はありません

・どういう意味ですか？  
・どうしていきなり「$GLOBALS」が出てきたのでしょうか？  
・スコープとの絡み？  
・リファレンスがポインタではないことと、どう関係あるのでしょうか？

[リンク](http://php.net/manual/ja/language.references.arent.php)


CC BY-SA 3.0
2016-08-07T23:19:07.797
28108
2016-08-07T23:59:12.980
7886
question
php
「リファレンスが行わないこと」に掲載されている内容を理解できないのですが、どういう意味？


リファレンスは簡単に言えば別名を作ることといったことになります。

> リファレンス以外にはコール側の変数スコープにある $bar を何かに結合する手段はありません

例えば

[code]

    $baz = 99;
    $bar = 77;
    
    function foo($var)
    {
        $var = 11;
    }
    foo($bar);
    
    print $bar . PHP_EOL; #77が出力される。
    
[/code]

変数$barを関数fooに渡して関数の内部で１１に変更しようとしていますが、  
変数$varはローカルな変数なので関数内部で変更しても元の変数$barに影響しません。($barは変更されません)

[code]

    function foo(&$var)
    {
        $var = 11;
    }
    foo($bar);
    
    print $bar . PHP_EOL; #11が出力される。
    
[/code]

関数の引数をリファレンスにした場合関数の引数$varは$barに結合されて（別名を作成した）  
$varへの変更はそのまま$barの変更になります。

> リファレンス以外にはコール側の変数スコープにある $bar を何かに結合する手段はありません

つまり関数の内部ではリファレンスを使わないと外部の変数を内部で変更できないということを言ってます。

> $var =& $GLOBALS["baz"];

は、当初は$barの別名（$barに結合されていた）であったが  
別の変数をリファレンス割り当てしたので、$barとの結合は切れてしまいました。  
（以降は$var への変更は$bazへの変更となる）  
（期待する動作とは$barに対して$baz（関数外の別の変数）のリファレンス割り当てがしたかった（？）がそのように動作しない）  
というようなことだと思います。

`$GLOBALS["baz"]`は、単に関数外部の$barとは別の変数（であればなんでもいい）という意味だと思います。

> これまでに説明したように、リファレンスはポインタではありません

というのは、[リファレンスとは?](http://php.net/manual/ja/language.references.whatare.php)
で説明されているように、  
Ｃ言語のように値としてのアドレスを受け渡しするのではないというようなことを言っているとおもわれます。  
別の言語を引き合いにしているので、知らない場合特に気にする必要はないかと思います。


CC BY-SA 3.0
2016-08-07T23:53:09.747
28110
2016-08-07T23:59:12.980
2016-08-07T23:59:12.980
5044
5044
28108
answer