Как и обещал, вернулся к flash сообщениям. Переделаем его на статические методы. Итак, немножко теории.
Статические методы могут вызываться без создания экземпляра класса (объекта), при объявлении метода указывается ключевое слово static. Точно так же объявляется и статический атрибут класса.
class Foo { static public $atr; static public function test() {} }
Т.к. статические атрибуты не связаны с экземпляром, то и вызов их осуществляется не через $this->atr, а через self::$atr, обращаю внимания на двойное двоеточие и баксик. Есть ещё одна печальная особенность, сильно ограничивающая маневры – при расширении (extends) класса статический атрибут остаётся связанным и с родителем, поэтому ждём PHP 5.2.6, где появится возможность вызывать через static::$atrатрибут определённого этого класса.
Заведём константы для разных типов сообщений
const INFO = 1;
const NOTICE = 2;
const WARNING = 3;
И статические переменные
static protected $_name = ‘flash’;
static protected $_nameMessage = ‘message’;
Первая служит ключом массива для flash сообщений, а второй для подвида — message, который имеет три вышеуказаных типа: информация, предупреждение и критическая ошибка.
Ну и описываем три основных метода
static public function get($index, $keep = false) { if ( self::isExists($index) ) { $retVal = $_SESSION[ self::$_name ][ $index ]; if (!$keep) { unset($_SESSION[ self::$_name ][ $index ]); } return $retVal; } } static function set($index, $value) { $_SESSION[ self::$_name ][ $index ] = $value; } static function isExists($index) { return isset($_SESSION[ self::$_name ][ $index ]); }
Первый — get, он принимает индекс и второй переменной может идти значение $keep, которая позволяет не удалять переменную после запроса. Ну а внутри проверяем есть ли что, берем и чистим если нужно.
Вот весь класс
<?php class Amdy_Flash { static protected $_name = 'flash'; static protected $_nameMessage = 'message'; const INFO = 1; const NOTICE = 2; const WARNING = 3; static public function get($index, $keep = false) { if ( self::isExists($index) ) { $retVal = $_SESSION[ self::$_name ][ $index ]; if (!$keep) { unset($_SESSION[ self::$_name ][ $index ]); } return $retVal; } } static function set($index, $value) { $_SESSION[ self::$_name ][ $index ] = $value; } static function isExists($index) { return isset($_SESSION[ self::$_name ][ $index ]); } static function setMessage($text, $type) { self::set( self::$_nameMessage, array( 'text' => $text, 'type' => $type ) ); } static public function getMessage($keep = false) { return self::get( self::$_nameMessage, $keep ); } static public function getMessageText($keep = false) { if ( self::isExists( self::$_nameMessage ) ) { $message = self::getMessage($keep); return $message['text']; } } static public function getMessageType($keep = true) { if ( self::isExists( self::$_nameMessage ) ) { $message = self::getMessage($keep); return $message['type']; } } static public function setInfo($text) { self::setMessage($text, self::INFO ); } static public function setNotice($text) { self::setMessage($text, self::NOTICE ); } static public function setWarning($text) { self::setMessage($text, self::WARNING ); } } ?>
Теперь его можно смело добавить в хелперы к форме, в другой статье напишу как.
Используем так
var_dump( Amdy_Flash::get('var') ); Amdy_Flash::set('var', 'value'); var_dump( Amdy_Flash::getMessageText() ); Amdy_Flash::setInfo('test');