Jak interpretuje PHP &$this
? Dlaczego jest dozwolone?
Przyszłam na to pytanie z następującymi problemami, które wyglądają jak błąd w PHP 7.1 i 7.2. Występuje z odwołaniami &$this
referencji i krzyżowych wywołań nazw i call_user_func_array
. Myślę, że &$this
jest dość dziwne i nie powinno być dozwolone, ale WordPress używa go na przykład.
Rozważmy następujący kod:
<?php
namespace N {
function callNeedRef($a) {
var_dump($a);
call_user_func_array('needRef', $a);
}
}
namespace {
function needRef(&$r) { }
function callNeedRef($a) {
var_dump($a);
call_user_func_array('needRef', $a);
}
class C {
function f() {
$a = $this;
callNeedRef(array(&$a)); // no warning (expected), OK!
N\callNeedRef(array(&$a)); // no warning (expected), OK!
callNeedRef(array(&$this)); // no warning (expected), but 7.1,7.2: var_dump prints no '&'
N\callNeedRef(array(&$this)); // 7.1,7.2: warn and var_dump prints no '&'
}
}
echo "<pre>";
echo phpversion() . PHP_EOL;
$o = new C();
$o->f();
}
a jego produkcja:
7.2.0RC2
array(1) {
[0]=>
&object(C)#1 (0) {
}
}
array(1) {
[0]=>
&object(C)#1 (0) {
}
}
array(1) {
[0]=>
object(C)#1 (0) {
}
}
array(1) {
[0]=>
object(C)#1 (0) {
}
}
Warning: Parameter 1 to needRef() expected to be a reference, value given in reftest.php on line 6
Jak już wspomniano w kodzie, dwa ostatnie var_dump
s dont oznaczyć przedmiot jako odniesienie. A ostatnie połączenie jest nawet ostrzeżeniem.
tylko jako aktualizacja. Oto, co dzieje się we wszystkich wersjach php: https://3v4l.org/8Ftbh#output –