Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- <?php
- interface ICommand
- {
- /**
- * Выполнить команду
- * @return void
- * @throws CommandException
- */
- function execute();
- /**
- * Откатить изменения, выполненные командой
- * @return void
- */
- function rollback();
- }
- interface ITransaction
- {
- /**
- * Добавить команду
- * @param ICommand $oCmd
- * @return void
- */
- function addCommand(ICommand $oCmd);
- /**
- * Выполнить транзакцию
- * @return boolean
- */
- function execute();
- }
- class CommandException extends Exception{}
- class MakeFileCreateException extends Exception{}
- /**
- *
- * @todo Подумать должен ли объект знать о своём состоянии (выполнена, не выполнена, выполнен откат). Например перед выполнением отката можно бы проверить, была выполнена команда или нет.
- */
- class MakeFile implements ICommand
- {
- static private $hash = array();
- /**
- * Путь к каталогу где хранятся файлы.
- */
- private $sFilePath;
- /**
- * @param string $sFilePath
- *
- * @todo Значение для пути корневогго каталога с файлами надо получать из конфига.
- * @todo Выполнить проверки на валидность пути.
- */
- function __construct($sFilePath)
- {
- if(!$sFilePath)throw new MakeFileCreateException('Не указан путь к файлу');
- $this->sFilePath = $sFilePath;
- }
- /**
- * Получить полный путь к файлу (в файловой системе).
- * @return string
- */
- private function getFullFilePath()
- {
- return 'zulu4';
- }
- /**
- * Выполнить команду
- * @return void
- * @throws CommandException
- */
- public function execute()
- {
- if(isset(self::$hash[$this->sFilePath])) throw new CommandException('Ошибка при создании файла: '.$this->getFullFilePath());
- self::$hash[$this->sFilePath]=true;
- }
- /**
- * Откатить изменения, выполненные командой
- *
- * @todo добавить обработку ошибок. Хотя бы запись в лог о неудачном откате команды.
- * @return void
- */
- public function rollback()
- {
- unset(self::$hash[$this->sFilePath]);
- }
- }
- class CommandTransaction implements ITransaction
- {
- private $arrCommands = array();
- /**
- * Добавить команду
- * @param ICommand $cmd
- * @return void
- */
- public function addCommand(ICommand $oCmd)
- {
- $this->arrCommands[] = $oCmd;
- }
- /**
- * Выполнить транзакцию
- *
- * @todo Здесь надо обрабатывать не только CommandException. Любое исключение должно приводить к откату транзакции
- * @return boolean
- */
- function execute()
- {
- static $counter = 0;
- $counter ++;
- return $counter % 2 != 0;
- }
- }
- ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement