/** * Основной метод, регистрирующий класс для закрытия * * @param Destructable $inst - Экземпляр класса, которй будет гарантированно закрыт в свою очередь * @param int $order - порядок закрытия */ public static function registerDestructable(Destructable $inst, $order) { /* * Класс получаем через get_called_class(), так как PsShotdownSdk может быть переопределён проектным */ $class = get_called_class(); /* * Проверяем, что нам передан валидный order */ $order = PsUtil::assertClassHasConstVithValue($class, null, PsCheck::int($order)); /* * Регистрируем shutdown */ if (is_null(self::$DESTRUCTS)) { PsUtil::assertClassHasDifferentConstValues($class); self::$DESTRUCTS = array(); register_shutdown_function(array(__CLASS__, '_doShotdown')); } /* * Проверим, что нет попытки повторной регистрации с тем-же order */ if (array_key_exists($order, self::$DESTRUCTS)) { raise_error("Попытка повторно зарегистрировать Destructable с порядком [{$order}] для класса " . get_class($inst)); } /* * Регистрируем класс на закрытие */ self::$DESTRUCTS[$order] = $inst; }
/** * Метод возвращает склонение слова в заданном падеже * * @param string $word - слово * @param string $type - требуемый падеж * @return type */ public function getInflection($word, $type = self::TYPE_ORIG) { if ($type == self::TYPE_ORIG) { return $word; //Сразу вернём оригинальное значение } PsUtil::assertClassHasConstVithValue(__CLASS__, 'TYPE_', $type); return array_get_value($type, $this->getInflections($word)); }
public function __construct($message, $code, $query, array $params, $previous = null) { $this->query = $query; $this->params = $params; $code = PsUtil::assertClassHasConstVithValue(__CLASS__, 'ERROR_', $code); if ($code == self::ERROR_NOT_CLASSIFIED) { /* * Если ошибка не классифицирована, то мы попробуем её классифицировать */ if (starts_with($message, 'Duplicate entry ')) { $code = self::ERROR_DUPLICATE_ENTRY; } } $message = $message ? $message : 'Unknown db error'; $message = "{$message}. Query: [{$query}]" . ($params ? ', Params: ' . array_to_string($params) . '.' : ''); parent::__construct($message, $code, $previous); }
/** * Метод меняет состояние, проверяя корректность текущего * * @param int $old - старое состояние * @param int $new - новое состояние */ private function changeState($old, $new) { $this->checkState($old); $this->STATE = PsUtil::assertClassHasConstVithValue(__CLASS__, 'STATE_', $new); }
/** * @covers PsUtil::assertClassHasConstVithValue */ public function testAssertClassHasConstVithValue() { $this->assertEquals('A', PsUtil::assertClassHasConstVithValue(new ClassA(), null, 'A')); $this->assertEquals('B', PsUtil::assertClassHasConstVithValue(ClassA::get__CLASS__(), 'CONST_', 'B')); $this->assertEquals('B', PsUtil::assertClassHasConstVithValue(ClassA::get__FILE__(), 'CONST_B', 'B')); try { //Константы не существует PsUtil::assertClassHasConstVithValue(new ClassA(), 'CONST_A', 'B'); $this->fail('Exception is expected'); } catch (PException $ex) { //OK } try { //Две константы с одинаковым значением PsUtil::assertClassHasConstVithValue(new ClassA(), 'CONST_', 'C'); $this->fail('Exception is expected'); } catch (PException $ex) { //OK } }