7

PHPのシリアル化/非シリアル化の概念について読んでいました。それらがfilesystem/dbにどのように保存されているのか疑問に思いました。バイナリ形式だと思います。しかし、クラス全体がどのように保存されているのでしょうか。データメンバーのデータを保存できることは理解しましたが、メソッドはどのように保存されますか?

つまり、PHPは、sayの関数内に記述されているコードをどのようにして知るのsomeFunc()でしょうか。

$obj = new ClassName();
$obj->someFunc();
$serial = serialize($obj);
$unserialobj = unserialize($serial);
$unserialobj->someFunc();

PHPは2行目で何をすべきかを知ることができますが、シリアル化されていないオブジェクトである5行目で何をすべきかをどのように知るのでしょうか。コードも保存されますか?

4

3 に答える 3

11

オブジェクトをシリアル化する場合、PHPはオブジェクトの現在の状態、つまりそのプロパティ値のみを保存します。メソッドをシリアル化しません。シリアル化を解除するときに、対応するクラスをメモリにロードする必要があります。PHPは、シリアル化された文字列からオブジェクトの状態を復元し、同じ名前のクラスから残りの情報(構造とメソッド)を取得します。

于 2011-10-24T09:17:16.137 に答える
6

PHPは2行目で何をすべきかを知ることができますが、シリアル化されていないオブジェクトである5行目で何をすべきかをどのように知るのでしょうか。コードも保存されますか?

はい、serialize()このオブジェクトがインスタンスであるクラスに関する情報とその状態が保存されるため、シリアル化を解除すると、そのクラスのインスタンス(この場合は)が取得されますClassName

于 2011-10-24T09:13:38.647 に答える
0

これは、phpでオブジェクトをシリアル化および非シリアル化することを理解するための簡単な例です。シリアル化を使用してオブジェクトを文字列に変換し、他のページでシリアル化を解除した後、このオブジェクトの現在のステータス(値の割り当てを含む)を使用します。

c.php

<?php class A {
      public $one ;

      public function A($val) {
          $this->one=$val;
         // echo $this->one;
      }

      function display(){
        echo $this->one;
      }

  }
  ?> 

c.phpファイルにはAという名前のクラスがあります。
a.php

<? 
require_once "c.php";

$ob= new A('by Pankaj Raghuwanshi : Object Searlization.');

$ob->display(); // Output is: by Pankaj Raghuwanshi : Object Searlization.

$s = serialize($ob);

// echo $s will show  a string of an object

?>
<br><A href='b.php?s=<?=$s;?>'>B-file</a>

このオブジェクトをシリアル化して文字列に変換し、getメソッドを使用してこの文字列を別のページに渡します。

注:この文字列は、セッションの使用などのさまざまな方法で1つのページから別のページに渡すことができます。また、DBに保存して別のページをフェッチし、テキストファイルに保存することができます。

このオブジェクトを別のファイル名でアンシリアル化しますb.php

b.php

<? 
require_once "c.php";

$ob = unserialize($_GET[s]);
$ob->display();
// Output is: by Pankaj Raghuwanshi : Object Searlization.
?> 

シリアル化を解除した後も、a.phpファイルと同じ動作を示し、a.phpの値を割り当てるオブジェクトは、オブジェクトのメモリに残ります。多くのhttpリクエストの後にこのオブジェクトのシリアル化を解除する場合。オブジェクトは、すべての割り当て値をメモリに保持します。

于 2014-07-25T13:05:21.193 に答える