2016-12-27 1 views
1

최근 버그를 발견했습니다. 간단히 설명 할 수 없습니다. 아주 간단한 문제이기 때문에 그렇게 열심히해서는 안되지만, PHP가 이런 일을 저지르는 이유를 모르겠습니다.이상한 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) 

을하는 $ _SESSION , 변경되었으며, 코드에는 아무 것도 없습니다 ...

$_SESSION['temp_obj'] = $data->temp; 

그래서 $ _SESSION 값을 덮어 쓰면 안됩니다. 또한 $ temp 변수를 덮어 씁니다.

오류가 표시되지 않습니다.

누구든지이 문제에 대해 나에게 약간의 빛을 줄 수 있습니까?

감사합니다.

+0

객체 그냥 포인터입니다. 그들은 영향을 미칩니다. –

답변

0

개체는 포인터 및 변경할 수있는 항목입니다. 그들은 원래 값이 영향을받을 때 영향을받습니다.

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

는 출력 :

A: stdClass Object (
    [id] => This is A 
) 
B: stdClass Object (
    [id] => This is B 
) 
C: stdClass Object (
    [id] => This is A 
) 
Let's change A! 
A: stdClass Object (
    [id] => Ha ha ha! 
) 
C: stdClass Object (
    [id] => Ha ha ha! 
) 

더 많은 정보를 원하시면 How do I create a copy of an object in PHP?를 참조하십시오.

0

이상한 것은 없습니다. 코드의 해당 줄은 다음과 같습니다.

$temp = new stdClass; 
$_SESSION['temp_obj'] = $temp; 
$data->temp = $_SESSION['temp_obj']; 

세 가지 모두 동일한 개체를 가리 킵니다. 이 작업을 수행한다면 :

$temp->foo = 'bar'; 

결과는 다음 중 하나와 같습니다

$_SESSION['temp_obj']->foo = 'bar'; 
$data->temp->foo = 'bar'; 
관련 문제