Никогда не попадает в блок, в котором берутся старые данные. Каждый раз перезаписывается. Написал за полчаса, утром надо, весь день на ногах. Если не сложно посмотрите свежим взглядом. Если до утра никто не посмотрит, закройте тему, я сам поправлю. PHP: <?php final class Forcer { public function __destruct() { Base::force(); } } final class Base { static private $init = false; static private $secret; static private $destruct; private function __construct () {} //объект не должен быть создан private function key() { return "123456"; } private function initMe () { if (self::$init == true) return true; self::$destruct = new Forcer(); self::$secret = unserialize( self::key() ^ $_SESSION["FrameVar"]); //типа здесь шифрование //здесь еще куча проверок на подлинность того что я прочитал if (self::$secret === NULL) { self::$secret = array(); } self::$init = true; return true; } public function saveVar ($alias,$var,$pass) { self::initMe(); if(array_key_exists($alias,self::$secret)) if (self::$secret[$alias]["pass"] != $pass) return false; self::$secret[$alias] = array ("pass"=>$pass,"var"=>$var); return true; } public function getVar ($alias,$pass) { self::initMe(); if(!array_key_exists($alias,self::$secret)) return false; if (self::$secret[$alias]["pass"] != $pass) return false; return self::$secret[$alias]["var"]; } public function force () { self::initMe(); $_SESSION["FrameVar"] = serialize(self::$secret) ^ self::key(); } } session_start(); echo "Session contain:<br>"; var_dump($_SESSION["FrameVar"]); echo "<br>"; $pass = "ерундовый пароль"; if(($a = Base::getVar("fignya",$pass))===false) { echo "Old a: ".$a."<br>"; $a = "Ерунда"; Base::saveVar("fignya",$a,$pass); echo "Saved: ".(Base::getVar("fignya",$pass)); } else { //никогда не попадает в этот блок echo "Cached: ".$a; } echo "<br>Session contain:<br>"; var_dump($_SESSION["FrameVar"]); echo "<br>end"; ?>
PHP: <?php final class Forcer { public function __destruct() { Base::force(); } } final class Base { static private $init = false; static private $secret; static private $destruct; private function __construct() { } //объект не должен быть создан private function key() { return "123456"; } private function initMe() { if (self::$init == true) return true; self::$destruct = new Forcer(); self::$secret = unserialize(self::key() ^ $_SESSION["FrameVar"]); //типа здесь шифрование //здесь еще куча проверок на подлинность того что я прочитал if (self::$secret === NULL) { self::$secret = array(); } self::$init = true; return true; } public function saveVar($alias, $var, $pass) { self::initMe(); if (array_key_exists($alias, self::$secret)) if (self::$secret[$alias]["pass"] != $pass) return false; self::$secret[$alias] = array("pass" => $pass, "var" => $var); return true; } public function getVar($alias, $pass) { echo "+++A"; self::initMe(); echo "B"; if (!array_key_exists($alias, self::$secret)) { echo "C"; return false; } if (self::$secret[$alias]["pass"] != $pass) { echo "D"; return false; } echo "E"; return self::$secret[$alias]["var"]; } public function force() { self::initMe(); $_SESSION["FrameVar"] = serialize(self::$secret) ^ self::key(); } } session_start(); echo "Session contain:<br>"; var_dump($_SESSION["FrameVar"]); echo "<br>"; $pass = "ерундовый пароль"; $a = Base::getVar("fignya", $pass); echo '$a = '; var_dump($a); echo "\n"; if ($a === false) { echo "Old a: " . $a . "<br>"; $a = "Ерунда"; Base::saveVar("fignya", $a, $pass); echo "Saved: " . (Base::getVar("fignya", $pass)); } else { //никогда не попадает в этот блок echo "Cached: " . $a; } echo "<br>Session contain:<br>"; var_dump($_SESSION["FrameVar"]); echo "<br>end"; ?> у меня $a становится false на 55 строке. Это не нормально? =) А нафига шифровать сессионные переменные? боишься гномика в компьютере?
Всё успешно допилено было в срок. В php XOR не коммутативный какой-то. По крайней мере, над строками. Заменил на нормальное шифрование и всё завелось