<?php
/**
* セッションをラップするクラス
*
* PHP version 5
*
* @package    core
* @author     stk2k <stk2k@sazysoft.com>
* @copyright  2008 stk2k, sazysoft
*/

class Session
{
	var $_data;

	/*
	 *	コンストラクタ
	 */
	public function __construct()
	{
		$this->_data = array();
	}

	/*
	 *	セッション名を取得
	 */
	public function getName()
	{
		return session_name();
	}

	/*
	 *	セッション保存場所を取得
	 */
	public function getSavePath()
	{
		return session_save_path();
	}

	/*
	 *	セッションクッキーのパラメータを取得
	 */
	public function getCookieParameter( $key )
	{
		$a = session_get_cookie_params();
		return $a[ $key ];
	}

	/*
	 *	セッションクッキーのパラメータをすべて取得
	 */
	public function getCookieParameters()
	{
		return session_get_cookie_params();
	}

	/*
	 *	初期化
	 */
	public function clear()
	{
		$this->_data = array();
	}

	/*
	 *    キー一覧を取得
	 */
	public function getKeys()
	{
		return array_keys( $this->_data );
	}

	/*
	 *    パラメータを取得
	 */
	public function get( $key )
	{
		if ( !isset($this->_data[ $key ]) ){
			return NULL;
		}
		$value = $this->_data[ $key ];
		return $value;
	}

	/*
	 *    パラメータを設定
	 */
	public function set( $key, $value )
	{
		$this->_data[ $key ] = $value;
	}

	/*
	 *    パラメータの設定を解除
	 */
	public function remove( $key )
	{
		if ( !isset( $this->_data[ $key ] ) ){
			return NULL;
		}
		$value = $this->_data[ $key ];
		unset( $this->_data[ $key ] );
		return $value;
	}

	/**
	 * セッションを開始する
	 */
	public function start()
	{
		session_cache_limiter('private, must-revalidate');
		session_start();
	}

	/**
	 * セッションを終了する
	 */
	public function close()
	{
		session_write_close();
	}

	/*
	 *    セッションを破棄
	 */
	public function destroy()
	{
		$this->clear();
		session_unset();
		session_destroy();
	}

	/**
	 * セッションを復元する
	 */
	public function restore()
	{
		// 配列の初期化
		$this->clear();

		// 各配列の値をデシリアライズ
		$keys = array_keys( $_SESSION );
		if ( $keys ){
			foreach( $keys as $key ){
				$value = unserialize( $_SESSION[$key] );
				$this->set( $key, $value );
			}
		}
	}

	/**
	 * セッションを保存する
	 */
	public function save()
	{
		// 初期化しておく
		$_SESSION = array();

		$keys = $this->getKeys();

		// メモリ上に設定されたキーの値をシリアライズ
		foreach( $keys as $key ){
			$value = $this->get( $key );
			$_SESSION[ $key ] = serialize($value);
		}
	}

	/*
	 *    文字列化
	 */
	public function __toString()
	{
		return System::arrayToString( $this->_data );
	}
}
