奇怪的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'];

我最近发现了一个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'];
$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';

对象只是指针。对象只是指针。他们会影响你。