2016-12-27 4 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']; 

これら3つのすべてが同じオブジェクトを指していることを意味します。あなたがこれを行うのであれば:

$temp->foo = 'bar'; 

結果は、これらのいずれかと同じである:

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