[ PHP ] SplStack, SplQueue クラスにシリアライズ機能を追加

Pocket

PHP5.3 以降、SPL ( Standard PHP Libraly )SplStackSplQueue クラスが追加され簡単にスタック構造とキュー構造を扱うことができるようになりました。

スポンサーリンク

SplStack と SplQueue クラスの使用例
$stack = new SplStack();

// スタックに配列のように要素を追加する場合
$stack[] = 1;
$stack[] = 2;

// push メソッドを使って要素を追加する
$stack->push(3);

// スタックなのでファーストインラストアウトとなる
var_dump($stack->pop()); // int 3
var_dump($stack->pop()); // int 2
var_dump($stack->pop()); // int 1

// 要素が空か確認する
var_dump($stack->isEmpty()); // true


$queue = new SplQueue();

// キューに配列のように要素を追加する場合
$queue[] = 1;
$queue[] = 2;

// enqueue メソッドを使って要素を追加する
$queue->enqueue(3);

// キューなのでファーストインファーストアウトとなる
var_dump($queue->dequeue()); // int 1
var_dump($queue->dequeue()); // int 2
var_dump($queue->dequeue()); // int 3

// 要素が空か確認する
var_dump($queue->isEmpty()); // true
SplStack と SplQueue クラスへシリアライズ機能を追加

次に、SplStackSplQueue クラスで扱うデータのシリアライズとデシリアライズ機能を追加してみます。なお、このサンプルは ZendFramework-2.0.0 ( bata4 ) 内のクラスです。

シリアライズ機能つき SplStack クラス

namespace Zend\Stdlib;

use Serializable;

/*
 * SplStackクラスを継承し同名(名前空間違い)のクラスを作成
 */
class SplStack extends \SplStack implements Serializable
{
    public function toArray()
    {
        $array = array();
        foreach ($this as $item) {
            $array[] = $item;
        }
        return $array;
    }

    /**
     * シリアライズ
     */
    public function serialize()
    {
        return serialize($this->toArray());
    }

    /**
     * デシリアライズ
     */
    public function unserialize($data)
    {
        foreach (unserialize($data) as $item) {
            $this->unshift($item);
        }
    }
}

シリアライズ機能つき SplQueue クラス

namespace Zend\Stdlib;

use Serializable;

/*
 * SplQueueクラスを継承し同名(名前空間違い)のクラスを作成
 */
class SplQueue extends \SplQueue implements Serializable
{
    public function toArray()
    {
        $array = array();
        foreach ($this as $item) {
            $array[] = $item;
        }
        return $array;
    }

    /**
     * シリアライズ
     */
    public function serialize()
    {
        return serialize($this->toArray());
    }

    /**
     * デシリアライズ
     */
    public function unserialize($data)
    {
        foreach (unserialize($data) as $item) {
            $this->push($item);
        }
    }
}

動作検証

$stack = new Zend\Stdlib\SplQueue();

// スタックにデータを追加する
$stack[] = 1;
$stack[] = 2;

// スタックにあるデータをシリアライズする
$ret = $stack->serialize();

// スタックからデータを取り出す
var_dump($stack->pop()); // int 2
var_dump($stack->pop()); // int 1

var_dump($stack->count());  // int 0

// シリアライズしたデータをデシリアライズで戻す
$stack->unserialize($ret);

// 再度スタックからデータを取得できる
var_dump($stack->pop()); // int 2
var_dump($stack->pop()); // int 1
参考
スポンサーリンク


Pocket

Leave a Comment

Your email address will not be published. Required fields are marked *