Advertisement
Guest User

Untitled

a guest
Jul 28th, 2017
64
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
PHP 3.40 KB | None | 0 0
  1. <?php
  2. interface ICommand
  3. {
  4.     /**
  5.      * Выполнить команду
  6.      * @return void
  7.      * @throws CommandException
  8.      */
  9.     function execute();
  10.  
  11.     /**
  12.      * Откатить изменения, выполненные командой
  13.      * @return void
  14.      */
  15.     function rollback();
  16.  
  17. }
  18.  
  19. interface ITransaction
  20. {
  21.  
  22.     /**
  23.      * Добавить команду
  24.      * @param ICommand $oCmd
  25.      * @return void
  26.      */
  27.     function addCommand(ICommand $oCmd);
  28.  
  29.     /**
  30.      * Выполнить транзакцию
  31.      * @return boolean
  32.      */
  33.     function execute();
  34. }
  35.  
  36. class CommandException extends Exception{}
  37. class MakeFileCreateException extends Exception{}
  38.  
  39.  
  40. /**
  41. *
  42. * @todo Подумать должен ли объект знать о своём состоянии (выполнена, не выполнена, выполнен откат). Например перед выполнением отката можно бы проверить, была выполнена команда или нет.
  43. */
  44.  
  45. class MakeFile implements ICommand
  46. {
  47.     static private $hash = array();
  48.    
  49.     /**
  50.     * Путь к каталогу где хранятся файлы.
  51.     */
  52.     private $sFilePath;
  53.    
  54.     /**
  55.     * @param string $sFilePath
  56.     *
  57.     * @todo  Значение для пути корневогго каталога с файлами надо получать из конфига.
  58.     * @todo  Выполнить проверки на валидность пути.
  59.     */
  60.     function __construct($sFilePath)
  61.     {
  62.         if(!$sFilePath)throw new MakeFileCreateException('Не указан путь к файлу');
  63.         $this->sFilePath = $sFilePath;
  64.     }
  65.  
  66.     /**
  67.      * Получить полный путь к файлу (в файловой системе).
  68.      * @return string
  69.      */
  70.    
  71.     private function getFullFilePath()
  72.     {
  73.         return 'zulu4';
  74.     }
  75.    
  76.    
  77.     /**
  78.      * Выполнить команду
  79.      * @return void
  80.      * @throws CommandException
  81.      */
  82.     public function execute()
  83.     {
  84.         if(isset(self::$hash[$this->sFilePath])) throw new CommandException('Ошибка при создании файла: '.$this->getFullFilePath());
  85.         self::$hash[$this->sFilePath]=true;
  86.     }
  87.  
  88.     /**
  89.      * Откатить изменения, выполненные командой
  90.      *
  91.      * @todo добавить обработку ошибок. Хотя бы запись в лог о неудачном откате команды.
  92.      * @return void
  93.      */
  94.     public function rollback()
  95.     {
  96.         unset(self::$hash[$this->sFilePath]);
  97.        
  98.     }
  99. }
  100.  
  101. class CommandTransaction implements ITransaction
  102. {
  103.     private $arrCommands = array();
  104.    
  105.    
  106.     /**
  107.      * Добавить команду
  108.      * @param ICommand $cmd
  109.      * @return void
  110.      */
  111.     public function addCommand(ICommand $oCmd)
  112.     {
  113.         $this->arrCommands[] = $oCmd;    
  114.     }
  115.  
  116.     /**
  117.      * Выполнить транзакцию
  118.      *
  119.      * @todo Здесь надо обрабатывать не только CommandException. Любое исключение должно приводить к откату транзакции
  120.      * @return boolean
  121.      */
  122.     function execute()
  123.     {
  124.         static $counter = 0;
  125.         $counter ++;
  126.         return $counter % 2 != 0;
  127.     }
  128. }
  129. ?>
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement