送信のために、 オブジェクト をネットワーク にアップロードする必要がある場合があります。送信を容易にするために、オブジェクト全体をバイナリ文字列に変換し、相手に到達したときに元のオブジェクトに復元することができます。このプロセスはシリアル化 (シリアル化とも呼ばれます) と呼ばれます。ちょうど、車を船で米国に輸送する場合と同じです。車は比較的大きいので、小さな部品に分解してから組み立てます。これらの部品をホイールに通して米国に発送し、これらの部品を組み立てて車に戻します。 平たく言えば、シリアル化は、
変数で表される「メモリ」データを「文字列」データ形式に変換してハードディスク上に保存する方法であり、逆シリアル化はその逆のプロセスです。 オブジェクトをシリアル化する必要がある状況は 2 つあります。1 つ目は、オブジェクトがネットワーク経由で送信される場合であり、2 つ目は、オブジェクトがファイルまたはデータベースにシリアル化される場合です。
シリアル化には 2 つのプロセスがあり、1 つはオブジェクトをバイナリ文字列に変換するシリアル化であり、もう 1 つはシリアル化解除 (逆シリアル化とも呼ばれます) です。オブジェクトに変換されたバイナリ文字列をオブジェクトに変換するには、 unserialize() 関数を使用してオブジェクトを逆シリアル化します。
PHPのserialize()関数のパラメータはオブジェクト名であり、戻り値は文字列です。通常、Serialize()によって返される文字列はオブジェクト情報を取得するために解析されません。返された文字列を使用するだけで済み、文字列をネットワークの反対側に送信したり、ファイルに保存したりできます。
PHPのunserialize()関数は、オブジェクトを逆シリアル化するために使用されます。この関数のパラメータは、当然、再編成されたオブジェクトです。
オブジェクトのシリアル化:
オブジェクトの逆シリアル化:
シリアル化メソッド:
$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 ); //将任何类型的变量数据,转换为“字符串” file_put_contents( '要保存的目标文本文件', $s1 ); //将该字符串,保存到一个文件里(就是硬盘数据)
デシリアライズメソッド:
$s1 = file_get_contens( '保存序列化数据的目标文本文件' ); //从一个文件里读出其中的所有字符 $v1 = unserialize($s1); //将该字符串数据,反序列化转换为变量(数据)
シリアル化とデシリアライズの例
<?phpclass Person{ var $name; var $sex; var $age; function construct($name = "", $sex = "", $age = "") { $this->name = $name; $this->sex = $sex; $this->age = $age; } function say() { echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>"; } }$p1 = new Person("张三", "男", 20);$p1_string = serialize($p1); //把一个对象串行化,返一个字符串 echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析//将$p1_string存储到文件file.txt中file_put_contents('./file.txt', $p1_string); $p2 = unserialize($p1_string); //把一个串行化的字符串反串行化形成对象 $p2$p2->say();//下面的做法和上面效果一样 $p3_file = file_get_contents('./file.txt'); //读取文件 $p3 = unserialize($p3_file); //反序列化 $p3->say();?>
O:6:"Person":3:{s:4:"name";s:4:"张三";s:3:"sex";s:2:"男";s:3:"age";i:20;}我的名字叫:张三 性别:男 我的年龄是:20
PHP5にはマジックメソッドsleep()メソッドとwakeup()メソッドがあり、それを変換すると、寝る前にいくつかの作業を完了するために sleep() メソッドが呼び出され、再び目覚めたとき、つまりオブジェクトがバイナリ文字列から再構成されたときに、PHP の別の関数 wakeup() が自動的に呼び出されます。一部のオブジェクトが起動するとすぐに実行するアクション。 sleep() 関数はパラメータを受け入れませんが、シリアル化する必要があるプロパティを含む
配列 を返します。 sleep() メソッドがない場合、含まれていない属性はシリアル化中に無視されます。PHP はすべての属性を保存します。
<?class Person{ var $name; var $sex; var $age; function construct($name = "", $sex = "", $age = "") { $this->name = $name; $this->sex = $sex; $this->age = $age; } function say() { echo "我的名字叫:" . $this->name . " 性别:" . $this->sex . " 我的年龄是:" . $this->age . "<br>"; } //指定串行化时把返回的数组中$name和$age值串行化,忽略没在数组中的属性$sex function sleep() { $arr = array("name", "age"); // 此时,属性$sex将被删除!!! return($arr); } //重新生成对象时,并重新赋值$age为40 function wakeup() { $this->age = 40; } }$p1 = new Person("张三", "男", 20);//把一个对象串行化,返一个字符串,调用了sleep()方法,忽略没在数组中的属性 $sex$p1_string = serialize($p1); echo $p1_string . "<br>"; //串行化的字符串我们通常不去解析 $p2 = unserialize($p1_string); //反串行化形成对象$p2重新赋值 $age为40 $p2->say();?>
O:6:"Person":2:{s:4:"name";s:4:"张三";s:3:"age";i:20;}我的名字叫:张三 性别: 我的年龄是:40
以上がPHP オブジェクト指向 - オブジェクトのシリアル化の詳細なコードの説明 Serialize()、__sleep()、__wakeup()の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。