2011-07-04 7 views
4

PHPリファレンスマニュアルでは、オブジェクトをシリアライズするときに、メソッドは保存されないと言われています。 (http://www.php.net/manual/en/language.oop5.serialization.php、パラグラフ1参照)。PHPはオブジェクトメソッドをシリアル化しますか?

ただし、マニュアルに記載されている最初の例では、シリアル化され、シリアル化されずに使用される方法を示しています。

これは矛盾していませんか?何か不足していますか?

答えて

9

最初の例では、メソッドがどこにシリアル化されているかわかりません。シリアライズするとき、メソッドはシリアライズされず、クラス名とプロパティだけがシリアライズされます。シリアライズされたデータを見れば、これを見ることができます

$ser = serialize($object); 
var_dump($ser); 

気付かれることはありません。ただし、オブジェクトのシリアル化を解除すると、クラス名によって再作成されます。つまり、新しいオブジェクトを取得しますが、以前にシリアル化した値を使用します。

通常、シリアル化されたオブジェクトまたはシリアル化されていないオブジェクトは同じように動作する必要があるため、このように重要ではありません。

// serialize 
class A { 
    public $a = null; 
    public function test() { 
    echo "Hello"; 
    } 
} 
$a = new A; 
echo $a->test(); // "Hello" 
$x = serialize($a); 

// unserialize (somewhere else) 
class A { 
    public $a = null; 
    public function test() { 
    echo "World"; 
    } 
} 
$a = unserialize($x); 
echo $a->test(); // "World" 

ここで、シリアライザは「間違った」クラスを使用し、出力が期待したものと異なります。クラス名の衝突がないことを確認する限り、通常はそれについて考える必要はありません。

+0

KingCrunchに感謝します。私はリファレンスマニュアルを読むときに間違った前提をいくつか作りました。あなたの説明はそれを明確にします。 –

2

方法がシリアルではなく、オブジェクトがメンバであるクラスがある:

オブジェクト内のメソッドがクラスの名のみ、保存されません。もしアンシリアライズするときメソッドは、クラス定義の一部ではなく、オブジェクト自体のメンバーであるようにあなたは、そのシリアライズインスタンスのメソッドを呼び出すことができるよう

したがって、あなたは、同じクラスのインスタンスを取得します。これはもちろん、直列化解除時に同じクラス定義を持っていることを前提としています。

オブジェクトをシリアル化できないようにするには、そのオブジェクトのクラスを定義する必要があります。

+0

新しい新しいインスタンスではありません。それがシリアル化されたときにそのオブジェクトのステージに戻るだけです。 –

+0

@Shakti:これは新しいインスタンスです。つまり、オブジェクトのプリシリアライズ状態を再構築しますが、新しいインスタンスの上に再構築します。 (例えば)シリアライズされたオブジェクトをファイルから読み書きすることができるため、異なる呼び出し中にインスタンスを保持する方法はありません。 ( '($ a === unserialize(serialize($ a)))=== false)') – KingCrunch

関連する問題