php/e12ref.php

<?php
require_once('env.php');
outBegin('PHP ref operator');
outH('assignment is deep copyOnWrite');
$a = ['0-x', '1-x', '2-x', ['3.0-x', '3.1-x', '3.2-x'], [['4.0.0-x', '4.0.1-x', '4.0.2-x']]];
$b = $a; 
$a[1] = '1-ya';
$a[3][1] = '3.1-ya';
$a[4][0][1] = '4.0.1-ya';
$b[2] = '2-yb';
$b[3][2] = '3.2-yb';
$b[4][0][2] = '4.0.2-yb';
out('a original..', $a);
out('b copy of a0', $b);

outH('references are NOT pointers, but refer to variables!');
$v = '&$v=varV0';
$a = [['a0', 'b0'], ['c0' , 'd0'], &$v];
$q = $a[0];
$r = &$a[1];
$s = &$a[1];
$b = $a;
$b[] = 'bCopiedFromA0';
outEC('0 ini ..... : a', $a, 'q', $q, 'r', $r, 'v', $v);
$a[0][0] = 'a1';
$a[1][0] = 'c1';
$q[1] = 'q1';
$r[1] = 'r1';
$v = '&$v=varV1';
outEC('1 $* = *1 . : a', $a, 'q', $q, 'r', $r, 'v', $v);
outEC('b copy of a0: b', $b);

$a[0][0] = 'a2';
fa($a[1][0], 'c2');
fa1($q, 'q2');
fa1($r, 'r2');
outEC('2 fa($*, *2): a', $a, 'q', $q, 'r', $r);

$a[0][0] = 'a3';
fr($a[1][0], 'c3');
fr1($q, 'q3');
fr1($r, 'r3');
outEC('3 fr($*, *2): a', $a, 'q', $q, 'r', $r);

out('*** however, references to array indexes, belong to array, not variable');
$a[1] = 'a1-string4';
$v = ['var', 'V4'];
outEC('4 a1=>str:    a', $a, 'q', $q, 'r', $r);
$s = ['sa5', 'sb5', 'sc5'];
outEC('5 s=>new arr  a', $a, 'q', $q, 'r', $r);
$a = [['n5', 'o5'], 'p5'];
outEC('5 new $a:     a', $a, 'q', $q, 'r', $r);
out('*** confusing use of reference');
$v='&$v7';
$w=[&$v];
outEC('w[0] ref ov v  v', $v, 'w', $w);
$v = ['...v8', 8];
$w[] = &$v;
outEC('added new v    v', $v, 'w', $w);
outH("foreach reference");

unset($a, $v);
$a = [[0, 'zero'], [1, 'eins'], [2, 'zwei']];
outOL("foreach and references", $a);
foreach($a as $k => $v)
    $v[1] .= "+v$k";
outLi('after foreach $k => $v', $a);
$h='';
foreach($a as $k => &$v) {
    $v[1] .= "+r$k";
    $h .= $k;
}
outLi('after foreach $k => $v', $a, "h=$h");
unset($v); # this is crucial, otherwise references will be redirected!!!!!!!!!!!!!
$h='';
for ($v=end($a); $v !== false; $v=prev($a)) {
    $k= key($a);
    #$v[1] .= "+b$k";
    $h .= $k;
}
outLi('backward value v=', $a, "h=$h");
$h='';
for ($v=end($a); $v !== false; $v=prev($a)) {
    $k= key($a);
    $v = &$a[$k]; # no otherway to get reference!
    $h .= $k;
    $v[1] .= "+c$h";
    unset($v); # this is crucial, otherwise references will be redirected!!!!!!!!!!!!!
}
outLi('backward ref v=&', $a, "h=$h");

outOLEnd();

outEnd(__file__);
function fa($a, $v) {
    $a = $v;
}
function fa1($a, $v) {
    $a [1] = $v;
}

function fr(&$a, $v) {
    $a = $v;
}

function fr1(&$a, $v) {
    $a [1] = $v;
}

?>