/** * @used-by df_preg_match() * @used-by df_preg_match_int() * Возвращает: * 1) string, если текст соответствует регулярному выражению * 2) string[], если текст соответствует регулярному выражению, * и регулярное выражение содержит несколько пар круглых скобок. * 3) null, если текст не соответствует регулярному выражению * 4) false, если при соответствии произошёл внутренний сбой функции @see preg_match() * @throws \Exception * @return string|string[]|null|bool */ public function match() { if (!isset($this->{__METHOD__})) { /** @var string|null|bool $result */ /** @var int|bool $matchResult */ /** @var string[] $matches */ // Собачка нужна, чтобы подавить warning. $matchResult = @preg_match($this->getPattern(), $this->getSubject(), $matches); if (false !== $matchResult) { if (1 === $matchResult) { /** * Раньше тут стояло: * $result = dfa($matchResult, 1); * что не совсем правильно, * потому что если регулярное выражение не содержит круглые скобки, * то результирующий массив будет содержать всего один элемент. * ПРИМЕР * регулярное выражение: #[А-Яа-яЁё]#mu * исходный текст: Категория Яндекс.Маркета * результат: Array([0] => К) * * 2015-03-23 * Добавил поддержку нескольких пар круглых скобок. */ $result = count($matches) < 3 ? df_last($matches) : df_tail($matches); } else { if (!$this->needThrowOnNotMatch()) { $result = null; } else { $this->throwNotMatch(); } } } else { if ($this->needThrowOnError()) { $this->throwInternalError(); } else { $result = false; } } $this->{__METHOD__} = df_n_set($result); } return df_n_get($this->{__METHOD__}); }
/** * @param string $class * @param string|string[] $functions * @return string[] */ protected static function _m($class, $functions) { df_assert($functions); /** @var string[] $result */ $result = []; if (!is_array($functions)) { $functions = df_tail(func_get_args()); } foreach ($functions as $function) { /** @var string $function */ $result[] = df_cc_method($class, $function); } return $result; }
/** * 2015-03-04 * Эта функция проверяет, принадлежит ли переменная $variable хотя бы к одному из классов $class. * Обратите внимание, что т.к. алгоритм функции использует стандартный оператор instanceof, * то переменная $variable может быть не только объектом, * а иметь произвольный тип: http://php.net/manual/language.operators.type.php#example-146 * Если $variable не является объектом, то функция просто вернёт false. * * Наша функция не загружает при этом $class в память интерпретатора PHP. * Если $class ещё не загружен в память интерпретатора PHP, то функция вернёт false. * В принципе, это весьма логично! * Если проверяемый класс ещё не был загружен в память интерпретатора PHP, * то проверяемая переменная $variable гарантированно не может принадлежать данному классу! * http://3v4l.org/KguI5 * Наша функция отличается по сфере применения * как от оператора instanceof, так и от функции @see is_a() тем, что: * 1) Умеет проводить проверку на приналежность не только одному конкретному классу, * а и хотя бы одному из нескольких. * 2) @is_a() приводит к предупреждению уровня E_DEPRECATED интерпретатора PHP версий ниже 5.3: * http://php.net/manual/function.is-a.php * 3) Даже при проверке на принаджежность одному классу код с @see df_is() получается короче, * чем при применении instanceof в том случае, когда мы не уверены, существует ли класс * и загружен ли уже класс интерпретатором PHP. * Например, нам приходилось писать так: class_exists('Df_1C_Cml2Controller', $autoload = false) && df_state()->getController() instanceof Df_1C_Cml2Controller * Или так: $controllerClass = 'Df_1C_Cml2Controller'; $result = df_state()->getController() instanceof $controllerClass; * При этом нельзя писать df_state()->getController() instanceof 'Df_1C_Cml2Controller' * потому что правый операнд instanceof может быть строковой переменной, * но не может быть просто строкой! * http://php.net/manual/en/language.operators.type.php#example-148 * @param mixed $variable * @param string|string[] $class * @return bool * @used-by Df_1C_Observer::df_catalog__attribute_set__group_added() */ function df_is($variable, $class) { /** @var bool $result */ if (2 < func_num_args()) { /** @var mixed[] $arguments */ $arguments = func_get_args(); /** @var string[] $classes */ $class = df_tail($arguments); } if (!is_array($class)) { $result = $variable instanceof $class; } else { $result = false; foreach ($class as $classItem) { /** @var string $classItem */ if ($variable instanceof $classItem) { $result = true; break; } } } return $result; }
/** * 2016-08-08 * @used-by \Df\Payment\Charge::iia() * @used-by \Df\Payment\Method::iia() * @param II|OP|QP $payment * @param string|string[]|null $keys [optional] * @return mixed|array(string => mixed) */ function dfp_iia(II $payment, $keys = null) { /** @var mixed|array(string => mixed) $result */ if (is_null($keys)) { $result = $payment->getAdditionalInformation(); } else { if (!is_array($keys)) { $keys = df_tail(func_get_args()); } $result = 1 === count($keys) ? $payment->getAdditionalInformation(df_first($keys)) : dfa_select_ordered($payment->getAdditionalInformation(), $keys); } return $result; }
/** * В настоящее время эта фукция не успользуется и осталасть только ради информации. * 2015-03-03 * Раньше алгоритм был таким: strtr($s, array_fill_keys($wordsToRemove, '')) * Он корректен, но новый алгоритм быстрее, потому что не требует вызова нестандартных функций. * http://php.net/str_replace * «If replace has fewer values than search, * then an empty string is used for the rest of replacement values.» * http://3v4l.org/9qvC4 * @param string $s * @param string|string[] $wordsToRemove * @return string */ function df_string_clean($s, $wordsToRemove) { if (!is_array($wordsToRemove)) { $wordsToRemove = df_tail(func_get_args()); } return str_replace($wordsToRemove, null, $s); }