[PHP-users 26748] Re: セッションの変更

古川敦史 agl @ mbi.nifty.com
2005年 9月 3日 (土) 18:06:23 JST


古川@フリーランスSEです。
セッションはブラウザを開いている間は残ります。
index.php側でセッションをsession_destoryで破棄するか?
該当のクラスを明示的に書き換えるほうがいいと思います。

自分の場合は、下記の自作クラス+reference で後はPHP任せです。
-- agSession.inc
<?php
//朋在来遠
// $Id: agSession.inc,v 1.5 2005/08/31 15:32:54 atsushifx Exp $
/**
 * クラス用セッションマネージャー
 *
 * 指定したクラスのインスタンスをセッションから取得する
 * セッションが始まっていない場合は、新しくインスタンスを作成してセッションに登録する
 *
 * Example:
 * <code>
 * $var =&  agSession::manager(className, [init1], [init2]);
 * $var->var1 = xxx;
 * </code>
 *
 * @package jp.sf.aglib
 *
 * @copyright Copyright &copy; 2003-2005 <a href="http://aglib.sourceforge.jp/">aglib Project</a>
 * @license http://www.opensource.org/licenses/bsd-license.php
 * @license http://www.jp.freebsd.org/www.freebsd.org/ja/copyright/freebsd-license.html
 *
 * @since   1.00
 * @version $Revision: 1.5 $
 * @create  2004-05-05
 *
 * @author  Furukawa Atsushi <atsushifx @ aglabo.com>
 */

/**
 * agSession: クラス用セッションマネージャー
 *
 * 指定したクラスをセッションから取得する
 * セッションにないときは、新たにインスタンスを作成しセッションに登録する
 *
 * @version 1.00.02
 * @since   1.10
 *
 * @author  Furukawa Atsushi <atsushifx @ aglabo.com>
 */
class agSession {
    /**
     * インスタンス取得
     *
     * 指定したクラスのインスタンスをセッションから取得する
     * 必要ならセッションにクラスを登録する
     *
     * @param string セッションから取得するクラス
     * @param miexed(opt)    初期化パラメータ1
     * @param miexed(opt)    初期化パラメータ2
     * @return       登録したインスタンス/false:Illegal Class
     */
    function &manager($class, $init1=null, $init2=null)
    {
        if ($class=='' || !class_exists($class))    return false;
        if (agSession::is_registered($class)) {
            $instance = & $_SESSION[AG_SESSION_KEY][$class];
        } else {
            $instance = & agSession::register($class, $init1, $init2);
        }
        return $instance;
    }

    /**
     * 指定したクラスがセッションに登録されているかチェックsる
     *
     * @param string クラス名
     * @return bool  true:登録済み/false:未登録/クラスではない
     */
    function is_registered($class)
    {
        if (is_object($class)) { $class = get_class($class); }
        if ($class=='' || !class_exists($class))    return false;
        return isset($_SESSION[AG_SESSION_KEY][$class]);
    }

    /**
     * インスタンス登録
     *
     * インスタンスをセッションに登録する
     *
     * @param mixed     登録するインスタンス/クラス
     * @param [miexed]  初期化パラメータ1
     * @param [miexed]  初期化パラメータ2
     * @return &object  登録したインスタンス
     */
    function & register($instance, $init1=false, $init2=false)
    {
        if (is_object($instance)) {
            $class = get_class($instance);
        } else {
            $class = $instance;
            $instance = & new $class($init1, $init2);
        }
        $_SESSION[AG_SESSION_KEY][$class] = $instance;
        $instance = & $_SESSION[AG_SESSION_KEY][$class];
        return $instance;
    }

    /**
     * インスタンス登録解除
     *
     * クラスのインスタンスをセッションから解除する
     *
     * @param mixed     セッションに登録していたインスタンス
     * @return NULL     NULL
     */
    function unregister($class)
    {
        if (is_object($class)){ $class = get_class($class); }
        if ($class) { unset($_SESSION[AG_SESSION_KEY][$class]); }
        return NULL;
    }

    /**
     * セッション終了
     *
     * セッションを終了する
     *
     * @param void
     * @return bool     true:終了成功/false:終了失敗
     */
    function destroy()
    {
        if (isset($_COOKIE[agSession::getName()])) {
            setcookie(agSession::getName(), '', time()-42000, '/');
        }
        $er = session_destroy();
        return $er;
    }

    /**
     * セッション名取得
     *
     * @param void
     * @return string   セッション名
     */
    function getName()
    {
        return session_name();
    }

    /**
     * セッションID取得
     *
     * @param void
     * @return string   セッションID
     */
    function getId()
    {
        return session_id();
    }

    /**
     * SID有効/無効化設定
     *
     * @param bool  SID有効化フラグ(true:有効/false:無効)
     * @return bool 現在のSID設定
     */
    function useSID($use = null)
    {
        $old_use_sid = ini_get('session.use_trans_sid');
        if (is_bool($use)) {
            ini_set('session.use_trans_sid', $use);
        }
        return $old_use_sid;
    }

    /**
     * SID取得
     *
     * @param void
     * @return bool 現在のSID設定
     */
    function sid()
    {
        return agSession::getName() . "=" . agSession::getId();
    }
}
?>
--





-- /Private
aglib (http://aglib.sourceforge.jp)、開発中
//Furukawa Atsushi / 古川 敦史
E-Mail: agl @ violet.plala.or.jp
Y!Messanger: KeePeeLue
Skype: atsushifx
MOBILE: 070-5010-5225
FAX: 020-4622-3018
HomePage: http://www.aglabo.com/agl/
          http://plaza.rakuten.co.jp/atsuhsifx/



PHP-users メーリングリストの案内