奇怪的PHP编写会话时没有请求它
我最近发现了一个bug,很简单,我无法解释。这应该没那么难,因为这是一个非常简单的问题,但似乎我对PHP的一些知识并不了解 让我们看一段简单的代码:奇怪的PHP编写会话时没有请求它,php,session,Php,Session,我最近发现了一个bug,很简单,我无法解释。这应该没那么难,因为这是一个非常简单的问题,但似乎我对PHP的一些知识并不了解 让我们看一段简单的代码: session_start(); $temp = new stdClass; $temp->id = 1; $temp->name = "A"; $_SESSION['temp_obj'] = $temp; $data = new stdClass; $data->temp = $_SESSION['temp_obj'];
session_start();
$temp = new stdClass;
$temp->id = 1;
$temp->name = "A";
$_SESSION['temp_obj'] = $temp;
$data = new stdClass;
$data->temp = $_SESSION['temp_obj'];
$data->temp->name = 'B';
print_r($_SESSION['temp_obj']);
输出,应该是:
stdClass Object ( [id] => 1 [name] => A )
但是相反,它说
stdClass Object ( [id] => 1 [name] => B )
因此,$\u会话已被更改,代码中没有任何内容具有
$_SESSION['temp_obj'] = $data->temp;
因此,它永远不会覆盖$\u会话值。此外,它还覆盖$temp变量
我看不到错误。对象是指针和可变项。当原始值受到影响时,它们会受到影响
<?php
header("Content-type: text/plain");
$a = new stdClass;
$a->id = "This is A";
$b = new stdClass;
$b->id = "This is B";
$c = $a;
echo "A: ";
print_r($a);
echo "B: ";
print_r($b);
echo "C: ";
print_r($c);
echo "Let's change A!\n";
$a->id = "Ha ha ha!";
echo "A: ";
print_r($a);
echo "C: ";
print_r($c);
?>
有关更多信息,请参阅。对象是指针和可变项。当原始值受到影响时,它们会受到影响
<?php
header("Content-type: text/plain");
$a = new stdClass;
$a->id = "This is A";
$b = new stdClass;
$b->id = "This is B";
$c = $a;
echo "A: ";
print_r($a);
echo "B: ";
print_r($b);
echo "C: ";
print_r($c);
echo "Let's change A!\n";
$a->id = "Ha ha ha!";
echo "A: ";
print_r($a);
echo "C: ";
print_r($c);
?>
有关更多信息,请参阅。没有什么奇怪的。代码中的这些行:
$temp = new stdClass;
$_SESSION['temp_obj'] = $temp;
$data->temp = $_SESSION['temp_obj'];
这意味着它们三个都指向同一个对象。因此,如果您这样做:
$temp->foo = 'bar';
结果与以下任一结果相同:
$_SESSION['temp_obj']->foo = 'bar';
$data->temp->foo = 'bar';
没有什么奇怪的。代码中的这些行:
$temp = new stdClass;
$_SESSION['temp_obj'] = $temp;
$data->temp = $_SESSION['temp_obj'];
这意味着它们三个都指向同一个对象。因此,如果您这样做:
$temp->foo = 'bar';
结果与以下任一结果相同:
$_SESSION['temp_obj']->foo = 'bar';
$data->temp->foo = 'bar';
对象只是指针。对象只是指针。他们会影响你。