/** * 2016-07-01 * The method returns a package's information from its composer.json file. * The method can be used not only for the custom packages, * but for the standard Magento packages too. * «How is @see \Magento\Framework\Composer\ComposerInformation::getInstalledMagentoPackages() * implemented and used?» https://mage2.pro/t/1796 * @param string $name * @return CP|P|IP|null */ function df_package($name) { /** @var array(string => P|IP) $packages */ static $packages; if (!isset($packages[$name])) { /** * 2016-07-05 * Раньше алгоритм был таким: df_composer_repository_l()->findPackage($name, '*') * Однако устаревшие версии Composer * (например, 1.0.0-alpha10, которая используется в Magento 2.0.0) * не поддерживают синтаксис со звёздочкой. * Поэтому нашёл другой путь, причём он даже более простой. */ /** @var CP|P|IP|null $result */ $result = null; foreach (df_composer_repository_l()->getPackages() as $package) { /** @var CP|P|IP $package */ if ($name === $package->getName()) { $result = $package; break; } } $packages[$name] = df_n_set($result); } return df_n_get($packages[$name]); }
/** * @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__}); }
/** * 2016-07-31 * Без проверки на closure будет сбой: * «Function Df\Config\{closure}() does not exist». * @return RFA|RF|RM|null */ private function functionA() { if (!isset($this->{__METHOD__})) { $this->{__METHOD__} = df_n_set($this->method() ?: ($this->functionName() && !$this->isClosure() ? new RF($this->functionName()) : null)); } return df_n_get($this->{__METHOD__}); }
/** * 2016-07-18 * @param string|null $key [optional] * @return Response|string|null */ private function response($key = null) { /** @var string $f */ $f = dfa(['L' => 'df_last', 'F' => 'df_first'], substr(df_caller_f(), -1)); if (!isset($this->{__METHOD__}[$f])) { $this->{__METHOD__}[$f] = df_n_set(call_user_func($f, $this->responses())); } /** @var Response|null $r */ $r = df_n_get($this->{__METHOD__}[$f]); return !$r || is_null($key) ? $r : $r[$key]; }
/** * @param string $name * @return string|int|array|float|null */ private function getAttributeInternal($name) { if (!isset($this->{__METHOD__}[$name])) { $this->{__METHOD__}[$name] = df_n_set($this->e()->getAttribute($name)); } return df_n_get($this->{__METHOD__}[$name]); }