PHP“按引用分配”古怪
作者:互联网
我遇到了一个代码段,其中包括$a =& $B;但尚未测试$b是否实际存在(如果(isset($b))).我不确定PHP如何处理此问题,所以我进行了快速的裸露测试,现在我变得更加感兴趣.
$a = array('a'=>'b', 'x'=>'y');
$b = array();
$b[10] = &$a['a'];
$b[11] = &$a['ppp'];
var_dump($a);
var_dump($b);
echo (isset($a['ppp']) ? "SET" :" NOT SET") . "\n";
echo (isset($b[11]) ? "SET" :" NOT SET") . "\n";
这是简单的代码,但是输出显示的是:
>仅$b [11] =& $a [‘ppp’]的裸分配就足够了,即使没有为$a [‘ppp进行赋值],也将var_dump($a)报告为具有3个成员而不是2个成员. “]. $a [‘ppp’]报告为具有值(NULL),但也具有isset()= FALSE.
>同时,$b [11]同时显示一个值NULL和isset()= FALSE,即使其引用对象(显然)确实存在(!)
我很高兴首先检查可以解决“问题”,但我主要是在寻求更深入的了解.发生了什么?
解决方法:
解释很简单
If you assign, pass, or return an undefined variable by reference, it will get created.
(强调我的)
那就是你在做什么;通过引用分配未定义的索引,以便创建它.
Example #1 Using references with undefined variables
<?php
function foo(&$var) { }
foo($a); // $a is "created" and assigned to null
$b = array();
foo($b['b']);
var_dump(array_key_exists('b', $b)); // bool(true)
$c = new StdClass;
foo($c->d);
var_dump(property_exists($c, 'd')); // bool(true)
?>
然后您还有另一个问题:
Meanwhile at the same time, $b[11] shows a value NULL and isset()=FALSE even though its referent (apparently) does exist (!)
手册上也有明确说明
07001 — Determine if a variable is set and is not NULL
isset() will return FALSE if testing a variable that has been set to NULL
由于它为NULL,所以isset()返回FALSE.
标签:php,variable-assignment,reference 来源: https://codeday.me/bug/20191010/1886163.html