PHP オブジェクト指向 - オブジェクトのシリアル化の詳細なコードの説明 Serialize()、__sleep()、__wakeup()

黄舟
リリース: 2023-03-07 06:20:01
オリジナル
1799 人が閲覧しました

送信のために、 オブジェクト をネットワーク にアップロードする必要がある場合があります。送信を容易にするために、オブジェクト全体をバイナリ文字列に変換し、相手に到達したときに元のオブジェクトに復元することができます。このプロセスはシリアル化 (シリアル化とも呼ばれます) と呼ばれます。ちょうど、車を船で米国に輸送する場合と同じです。車は比較的大きいので、小さな部品に分解してから組み立てます。これらの部品をホイールに通して米国に発送し、これらの部品を組み立てて車に戻します。 平たく言えば、シリアル化は、
変数で表される「メモリ」データを「文字列」データ形式に変換してハードディスク上に保存する方法であり、逆シリアル化はその逆のプロセスです。 オブジェクトをシリアル化する必要がある状況は 2 つあります。1 つ目は、オブジェクトがネットワーク経由で送信される場合であり、2 つ目は、オブジェクトがファイルまたはデータベースにシリアル化される場合です。
シリアル化には 2 つのプロセスがあり、1 つはオブジェクトをバイナリ文字列に変換するシリアル化であり、もう 1 つはシリアル化解除 (逆シリアル化とも呼ばれます) です。オブジェクトに変換されたバイナリ文字列をオブジェクトに変換するには、 unserialize() 関数を使用してオブジェクトを逆シリアル化します。
PHPのserialize()関数のパラメータはオブジェクト名であり、戻り値は文字列です。通常、Serialize()によって返される文字列はオブジェクト情報を取得するために解析されません。返された文字列を使用するだけで済み、文字列をネットワークの反対側に送信したり、ファイルに保存したりできます。
PHPのunserialize()関数は、オブジェクトを逆シリアル化するために使用されます。この関数のパラメータは、当然、再編成されたオブジェクトです。


オブジェクトのシリアル化:

  1. オブジェクトのシリアル化はその属性データのみを「保存」でき、メソッドは無視されます(メソッドはデータではありません)

  2. オブジェクトがシリアル化されるとき、クラスのマジックメソッドオブジェクトが属するものは自動的に呼び出されます: sleep()

オブジェクトの逆シリアル化:

  1. オブジェクトの逆シリアル化は、実際には回復期間中に元々保存されていた属性データです。オブジェクトの元のクラスに依存する必要があります。

  2. オブジェクトが逆シリアル化されると、オブジェクトが属するクラスのマジックメソッドwakeup()

すべてシリアル化されます

1.serialize(オブジェクト名)

指定されたクラスオブジェクトをシリアル化 $str=serialize($per) //オブジェクトごとにシリアル化し、結果を$strに返す



シリアル化メソッド:

$v1 = 123; //这是一个变量,代表任意的内存数据$s1 = serialize( $v1 );  //将任何类型的变量数据,转换为“字符串”
file_put_contents( '要保存的目标文本文件', $s1 );    //将该字符串,保存到一个文件里(就是硬盘数据)
ログイン後にコピー

2.unserialize( シリアル化後の戻り値)

デシリアライズ、戻り結果はオブジェクト $per=unserialize($str);

デシリアライズメソッド:

$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(&#39;./file.txt&#39;, $p1_string);
$p2 = unserialize($p1_string);    //把一个串行化的字符串反串行化形成对象
$p2$p2->say();//下面的做法和上面效果一样
$p3_file = file_get_contents(&#39;./file.txt&#39;); //读取文件
$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
ログイン後にコピー

部分シリアル化

1.sleep()

オブジェクトの一部の属性をシリアル化します。

2.wakeup()

デシリアライズする際に、オブジェクトの内容を初期化(実際に変更)します

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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!