编程语言
首页 > 编程语言> > PHP“按引用分配”古怪

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)
?> 

Example from PHP Manual

然后您还有另一个问题:

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