忍者ブログ
[PR]
×

[PR]上記の広告は3ヶ月以上新規記事投稿のないブログに表示されています。新しい記事を書く事で広告が消えます。



2024/04/26 08:15 |
Serializableの動作変更その2

前回マジックメソッド__sleep、__wakeupによるシリアライズを行いましたが、今回はSerializableインターフェイスで同じことを行ってみます。

両者がどう違うかというと、マジックメソッド__sleepはあくまでシリアライズ対象を変更できるだけであったのに対し、Serializableインターフェイスによるシリアライズは出力をわりかし自由にできるという点です。

SerialExample2.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
<?php
    
//適当なクラス
class SerialExample implements Serializable{
    
    //インスタンス変数とか
        private $string_serial='';
        private $string_no_serial='';
    
    //セッタゲッタ
        public function __set($name,$value){
            if($name=='string_serial' || $name=='string_no_serial'){
                $this->{$name}=$value;
                return true;
            }else{
                return false;
            }
        }
        public function __get($name){
            if($name=='string_serial' || $name=='string_no_serial'){
                return $this->{$name};
            }else{
                return false;
            }
        }
    
    //シリアライズ
        public function serialize(){
            //シリアライズした文字列を返す
            return mcrypt_encrypt(MCRYPT_DES,'hogehoge'
         ,$this->string_serial,MCRYPT_MODE_ECB);
        }
    
    //アンシリアライズ
        public function unserialize($serial){
            //シリアライズされた文字列を元に戻す
            $this->string_serial=mcrypt_decrypt(MCRYPT_DES,'hogehoge'
         ,$serial,MCRYPT_MODE_ECB);
        }
    
//↓クラスのおわり
}

serialize2.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
<?php
    
    //SerialExample
        require_once('SerialExample2.php');
        $example=new SerialExample();
    
    //適当
        $example->string_serial='aaaaaaaa';
        $example->string_no_serial='bbbbbbbb';
        
        
    //シリアライズ
        $serial=serialize($example);
        
    //アンシリアライズ
        $desilial=unserialize($serial);
        
        var_dump($serial,$example,$desilial);

シリアライズ時にSerialExample::serializeが呼ばれ、シリアライズ後の文字列は、
string 'C:13:"SerialExample":8:{mィ^ョ・シ+}' (length=33)
というふうに暗号化されたなんだかよくわからない文字列となります。

周囲の'C:13'や'SerialExample'等はPHPが必要に応じて自動的に付けるので、実際に変更できるのはその後の{}の中となります。
今回は簡単な暗号化を行いました。

逆にアンシリアライズ時にはSerialExample::unserializeが呼ばれます。
   
object(SerialExample)[2]
  private 'string_serial' => string 'aaaaaaaa' (length=8)
  private 'string_no_serial' => string '' (length=0)

SerialExample::string_serialには無事、復号化後の文字列が収まりました。

 

PR


2009/10/16 22:06 | Comments(0) | TrackBack() | PHP

トラックバック

トラックバックURL:

コメント

コメントを投稿する






Vodafone絵文字 i-mode絵文字 Ezweb絵文字 (絵文字)



<<買った本リスト 2009/10/17 | HOME | Serializableの動作変更>>
忍者ブログ[PR]