Пример #1
0
 /**
  * Работающий метод. Обращается к private массивам класса и возвращает их данные по запросу.
  *
  * Ключ может быть составным, типа "['lvl1' => ['lvl2' => 'param1']]".
  * см. комментарий к kira\utils\Arrays::getValue()
  *
  * @param array  &$data массив данных в текущем классе
  * @param string $key   ключ в массиве данных. Возможно составной ключ.
  * @return array | string | null
  */
 private function getData(&$data, $key)
 {
     if ($key === null) {
         return $data;
     }
     return Arrays::getValue($data, $key);
 }
Пример #2
0
 /**
  * Получение данных из суперглобальных массивов $_GET, $_POST, $_COOKIE или $_REQUEST.
  *
  * Описание методов см. в комментарии к этому классу.
  *
  * Суть: парсим запрошенный метод. Если совпадает с тем, что мы поддерживаем, подключаемся к нужному массиву.
  * По заданному количеству параметров функции пытаемся вернуть требуемое значение. В частности в методе приведения
  * к типу ожидаем имя ключа в массиве, а при регулярке еще один параметр - шаблон регулярного выражения.
  *
  * Прим: параметры в этот метод попадают в виде неассоциативного массива, приходится по порядку ключей разбирать.
  *
  * Если вызов неправильный, кидаем исключение. Если значение в массиве не найдено (или регулярке не отвечает) - NULL
  *
  * @param string $method имя метода
  * @param array  $params параметры метода
  * @return mixed
  * @throws \RuntimeException
  * @throws \LogicException
  */
 public static function __callStatic($method, $params)
 {
     if (preg_match('/^(?<verb>get|post|request|cookie)(As(?<type>Int|Bool|Regexp|Enum))?$/', $method, $m)) {
         $verb = $m['verb'];
         $type = isset($m['type']) ? $m['type'] : null;
     } else {
         throw new \RuntimeException('Неизвестный метод ' . __NAMESPACE__ . "\\Request::{$method}()");
     }
     // Прим.: нельзя использовать переменные переменных в данном случае. Поэтому - через условие.
     // {@see http://php.net/manual/ru/language.variables.variable.php}, внизу варнинг.
     switch ($verb) {
         case 'get':
             $arr =& $_GET;
             break;
         case 'post':
             $arr =& $_POST;
             break;
         case 'cookie':
             $arr =& $_COOKIE;
             break;
         case 'request':
             $arr =& $_REQUEST;
             break;
         default:
             $arr = [];
     }
     if (!$params) {
         if ($type) {
             $secondParam = $type == 'Regexp' ? ', $pattern' : ($type == 'Enum' ? ', $expect' : '');
             throw new \RuntimeException("Пропущен обязательный параметр функции: имя ключа в массиве \$_{$verb}" . PHP_EOL . "Сигнатура вызова: {$method}(\$key{$secondParam})");
         }
         return $arr;
     }
     $key =& $params[0];
     $val = utils\Arrays::getValue($arr, $key);
     if (!$type || $val == '') {
         return $val;
     }
     if (is_array($val)) {
         throw new \LogicException('Для массива данных проверки содержимого невозможны. Полученное значение:' . utils\Dumper::dumpAsString($val));
     }
     switch ($type) {
         case 'Int':
             return preg_match('~^-?\\d+$~', $val) ? intval($val) : null;
         case 'Bool':
             return preg_match('~^true|1|on|yes|checked$~i', $val) ? true : (preg_match('~^false|0|off|no|unchecked$~i', $val) ? false : null);
         case 'Regexp':
             if (!isset($params[1])) {
                 throw new \RuntimeException('Пропущен обязательный параметр функции: шаблон регулярного выражения.' . PHP_EOL . "Сигнатура вызова: {$verb}AsRegexp(\$key, \$pattern)");
             }
             $pattern =& $params[1];
             return preg_match($pattern, $val) ? $val : null;
         case 'Enum':
             if (!isset($params[1])) {
                 throw new \RuntimeException('Пропущен обязательный параметр функции: массив допустимых значений.' . PHP_EOL . "Сигнатура вызова: {$verb}AsEnum(\$key, \$expect)");
             }
             return in_array($val, $params[1]) ? $val : null;
         default:
             return null;
     }
 }
Пример #3
0
 public function test_getValue()
 {
     $arr = ['path' => ['app' => ['level1' => '/home', 'level2' => '/www']]];
     $expect = Arrays::getValue($arr, ['path' => ['app' => 'level2']]);
     $this->assertEquals($expect, '/www', 'Получение значения массива по заданной цепочке ключей');
 }