<?php /** * oSessionException extends Exception * @author johan <johan.barbier@gmail.com> * @version 20061205 * */ class oSessionException extends Exception {
/** * Exception messages * */ const NAME_NOT_ALPHANUMERIC = '{__NAME__} is not a valid session name: session name must be alphanumeric'; const XML_FILE_NOT_EXISTS = '{__FILE__} has not been found'; const XML_LOADING_FAILED = 'Failed to load {__FILE__}'; const XML_EMPTY = 'XML configuration is empty'; const KEY_NOT_EXISTS = '{__KEY__} is not a valid key'; const TYPE_NOT_VALID = '{__TYPE__} is not a valid type for {__KEY__}, must be {__VALIDTYPE__}';
/** * Constructor * Calls Exception constructor * * @param string $sMsg * @param integer $iCode */ public function __construct ($sMsg, $iCode = 0) { parent::__construct ($sMsg, $iCode); } }
/** * oConf * @author johan <johan.barbier@gmail.com> * @version 20061205 * */ class oConf {
/** * Array of configuration * * @var array */ protected $aConf;
/** * Read the xml configuration file and fills the aConf property with its contents * * @param string $sConfFileName (xml configuration filename) */ protected function setConf ($sConfFileName) { if (!file_exists ($sConfFileName)) { throw new oUserException (str_replace ('{__FILE__}', $sConfFileName, oSessionException::XML_FILE_NOT_EXISTS)); } if (!($oXml = @simplexml_load_file ($sConfFileName)) instanceof SimpleXMLElement) { throw new oUserException (str_replace ('{__FILE__}', $sConfFileName, oSessionException::XML_LOADING_FAILED)); } foreach ($oXml -> children () as $oNode) { if (empty ($oNode)) { throw new oUserException (self::XML_EMPTY); } $this -> aConf[(string)dom_import_simplexml($oNode) -> tagName] = (string)$oNode['type']; } $this -> bHasConf = true; }
/** * Gets the configuration * * @return array */ public function getConf () { if (true === $this -> bHasConf) { return $this -> aConf; } return null; } }
/** * oSessionIterator implements Iterator * @author johan <johan.barbier@gmail.com> * @version 20061205 * */ class oSessionIterator implements Iterator {
/** * Array of session keys * * @var array */ private $aKeys;
/** * current key * * @var mixed */ private $mKey;
/** * oSession Iterator * * @var oSession object */ private $it;
/** * Constructor * Sets some parameters * * @param oSession $it */ public function __construct (oSession $it) { $this -> it = $it; $this -> aKeys = $this -> it -> getKeys (); }
/** * Reset the array of keys and sets current key * */ public function rewind () { $this -> mKey = reset ($this -> aKeys); }
/** * Returns current key * * @return mixed */ public function key () { return $this -> mKey; }
/** * Returns current value * * @return mixed */ public function current () { if (isset ($this -> it[$this -> mKey])) { return $this -> it[$this -> mKey]; } return null; }
/** * Gets next key * */ public function next () { $this -> mKey = next ($this -> aKeys); }
/** * Checks if current key is valid * * @return boolean */ public function valid () { if (isset ($this -> it[$this -> mKey])) { return true; } return false; } }
/** * oSession extends oConf implements IteratorAggregate, ArrayAccess, Countable * greatly inspired by PRADO framework <http://www.pradosoft.com/> * @author johan <johan.barbier@gmail.com> * @version 20061205 * */ class oSession extends oConf implements IteratorAggregate, ArrayAccess, Countable {
/** * Is the oSession initialized or not * * @var boolean */ private $bIsStarted = false;
/** * oSession has a configuration file or not * * @var boolean */ protected $bHasConf = false;
/** * Constructor * Checks configuration if any * * @param string $sConf Configuration filename */ public function __construct ($sConf = null) { if (!is_null ($sConf)) { $this -> setConf ($sConf); } }
/** * Sets a new configuration file * * @param string $sConfFileName Configuration filename */ public function setNewConf ($sConfFileName) { $this -> setConf ($sConfFileName); }
/** * Returns if oSession has a configuration or not * * @return boolean */ public function hasConf () { return $this -> bHasConf; }
/** * Starts a session * */ public function open () { if (false === $this -> bIsStarted) { $this -> bIsStarted = true; session_start (); } }
/** * Checks if an offset exists * ArrayAccess method * * @param mixed $mKey * @return boolean */ public function offsetExists ($mKey) { if (true === $this -> bIsStarted && isset ($_SESSION[$mKey])) { return true; } return false; }
/** * Gets an offset * ArrayAccess method * * @param mixed $mKey * @return mixed */ public function offsetGet ($mKey) { if (true === $this -> bIsStarted && isset ($_SESSION[$mKey])) { return $_SESSION[$mKey]; } return null; }
/** * Sets an offset if valid (if there is a configuration) * ArrayAccess method * * @param mixed $mKey * @param mixed $mVal */ public function offsetSet ($mKey, $mVal) { if (true === $this -> bHasConf) { if (!isset ($this -> aConf[$mKey])) { throw new oSessionException (str_replace ('{__KEY__}', $mKey, oSessionException::KEY_NOT_EXISTS)); } if (($sType = gettype ($mVal)) !== $this -> aConf[$mKey]) { throw new oSessionException (str_replace (array ('{__TYPE__}', '{__KEY__}', '{__VALIDTYPE__}'), array ($sType, $mKey, $this -> aConf[$mKey]), oSessionException::TYPE_NOT_VALID)); } } $_SESSION[$mKey] = $mVal; }
/** * Unset an offset * ArrayAccess method * * @param mixed $mKey */ public function offsetUnset ($mKey) { unset ($_SESSION[$mKey]); }
/** * Returns the size of the current session * Countable method * * @return integer */ public function count () { if (true === $this -> bIsStarted) { return count ($_SESSION); } return null; }
/** * Get the iterator of IteratorAggregation * IteratorAggregate method * * @return Iterator */ public function getIterator () { if (true === $this -> bIsStarted) { return new oSessionIterator ($this); } return new ArrayIterator (array ()); }
/** * Destroy current session * */ public function destroy () { if (true === $this -> bIsStarted) { session_destroy (); $this -> bIsStarted = false; } }
/** * Destroy totally current session (session, globals, cookie) * */ public function destroyAll () { $this -> clear (); if (isset($_COOKIE[session_name()])) { setcookie(session_name(), '', time()-42000, '/'); } session_destroy (); $this -> bIsStarted = false; }
/** * Get session name * * @return string */ public function getName () { if (true === $this -> bIsStarted) { return session_name (); } return null; }
/** * Set session name * * @param string $sName * @return string */ public function setName ($sName) { if (true === $this -> bIsStarted) { if (!ctype_alnum ($sName)) { throw new oSessionException (str_replace ('{__NAME__}', $sName, oSessionException::NAME_NOT_ALPHANUMERIC)); } return session_name ($sName); } return null; }
/** * Returns an array with the session * * @return array */ public function asArray () { if (true === $this -> bIsStarted) { return $_SESSION; } else { return null; } }
/** * Gets the session keys * * @return array */ public function getKeys () { if (true === $this -> bIsStarted) { return array_keys ($_SESSION); } else { return null; } }
/** * Clear the current session keys and values * */ public function clear () { foreach (array_keys ($_SESSION) as $mKey) { unset ($_SESSION[$mKey]); } }
/** * Get session ID * * @return string */ public function getId () { if (true === $this -> bIsStarted) { return session_id (); } return null; }
/** * Close a session * */ public function close () { if (true === $this -> bIsStarted) { session_write_close (); } } }
/** * Testing */ ob_start (); try { $oSession = new oSession ('config.xml'); $oSession -> open (); $oSession['ID'] = 666; echo $oSession['ID']; echo '<br />'; echo $oSession -> getId (); echo '<br />'; $oSession -> destroy (); echo count ($oSession); foreach ($oSession as $sKey => $mVal) { echo $sKey, ' => ', $mVal, '<br />'; } $oSession -> open (); $oSession['NAME'] = 'test'; echo '<br />'; echo count ($oSession); echo '<br />'; foreach ($oSession as $sKey => $mVal) { echo $sKey, ' => ', $mVal, '<br />'; } echo $oSession -> getName (); echo '<br />'; echo $oSession -> getId (); echo '<br />'; $oSession -> setName (1245.5); } catch (Exception $e) { echo $e -> getMessage (); }
ob_end_flush (); ?>
|