ソフト開発塾
PHPちょっとメモ:リファレンスのテスト(変数編)
リファレンス、C言語のポインタのようなもので、C言語のポインタで挫折している人にはむつかしいかもしれない。
PHPのリファレンスの挙動を次のテスト(チェック)プログラムを用意した。
<?php
error_reporting(E_ALL);
test_reference();
function test_reference(){
$ar_data['A'] = 'TEST_A_0';
$ar_data['B'] = 'TEST_B_0';
$mm_a = 'A0';
$mm_b = 'B0';
echo 'No00.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No00.[A0][TEST_A_0][B0][TEST_B_0]
$ar_data['A'] = & $mm_a;
$mm_b = & $ar_data['B'];
echo 'No01.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No01.[A0][A0][TEST_B_0][TEST_B_0]
$ar_data['A'] = 'TEST_A_2';
$ar_data['B'] = 'TEST_B_2';
echo 'No02.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No02.[TEST_A_2][TEST_A_2][TEST_B_2][TEST_B_2]
$mm_a = 'A3';
$mm_b = 'B3';
echo 'No03.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No03.[A3][A3][B3][B3]
$ar_data = array('A' => 'TEST_A_4','B' => 'TEST_B_4');
echo 'No04.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No04.[A3][TEST_A_4][B3][TEST_B_4]
$mm_a = 'A5';
$mm_b = 'B5';
echo 'No05.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No05.[A5][TEST_A_4][B5][TEST_B_4]
$ar_data['A'] = 'TEST_A_6';
$ar_data['B'] = 'TEST_B_6';
echo 'No06.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No06.[A5][TEST_A_6][B5][TEST_B_6]
$mm_a = & $mm_b;
echo 'No07.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No07.[B5][TEST_A_6][B5][TEST_B_6]
$mm_a = 'A8';
echo 'No08.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No08.[A8][TEST_A_6][A8][TEST_B_6]
$mm_b = & $ar_data['B'];
$ar_data['A'] = & $mm_a;
echo 'No09.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No09.[A8][A8][TEST_B_6][TEST_B_6]
$mm_a = 'A10';
echo 'No10.['.$mm_a.']['.$ar_data['A'].']['.$mm_b.']['.$ar_data['B'].']'.PHP_EOL;
// No10.[A10][A10][TEST_B_6][TEST_B_6]
}
No01.の結果は、リファレンスが分からなくても、なんとなく想像できる。
No02.No03.の結果が、PHPの特徴になる。C言語のポインタと同じ考え方をすると意味不明になる。
No04.の結果は、なんとなく想像できる。
No05.の結果が、意味することは...
No06.の結果とNo05.の結果から、No04.によって、リファレンスが無効になっている。(リファレンスの解除)
No07.の結果は、なんとなく想像できる。
No08.の結果は、No02.No03.の結果と同じ
No09.の結果は、なんとなく想像できるのだが...
No10.の結果は、No09.の$mm_b = & $ar_data['B'];によって、No07.の$mm_a = & $mm_b;が、無効になっている。(リファレンスの解除)