/** * 2015-04-03 * Для простых функций (не методов) вернёт название функции. * @used-by \Df\Qa\Method::raiseErrorParam() * @used-by \Df\Qa\Method::raiseErrorResult() * @used-by \Df\Qa\Method::raiseErrorVariable() * @return string */ public function methodName() { if (!isset($this->{__METHOD__})) { $this->{__METHOD__} = df_cc_method($this->className(), $this->functionName()); } return $this->{__METHOD__}; }
/** * @param int $levelsToSkip * Позволяет при записи стека вызовов пропустить несколько последних вызовов функций, * которые и так очевидны (например, вызов данной функции, вызов df_bt() и т.п.) * @return void */ function df_bt($levelsToSkip = 0) { /** @var array $bt */ $bt = array_slice(debug_backtrace(DEBUG_BACKTRACE_IGNORE_ARGS), $levelsToSkip); /** @var array $compactBT */ $compactBT = []; /** @var int $traceLength */ $traceLength = count($bt); /** * 2015-07-23 * 1) Удаляем часть файлового пути до корневой папки Magento. * 2) Заменяем разделитель папок на унифицированный. */ /** @var string $bp */ $bp = BP . DS; /** @var bool $nonStandardDS */ $nonStandardDS = DS !== '/'; for ($traceIndex = 0; $traceIndex < $traceLength; $traceIndex++) { /** @var array $currentState */ $currentState = dfa($bt, $traceIndex); /** @var array(string => string) $nextState */ $nextState = dfa($bt, 1 + $traceIndex, []); /** @var string $file */ $file = str_replace($bp, '', dfa($currentState, 'file')); if ($nonStandardDS) { $file = df_path_n($file); } $compactBT[] = ['File' => $file, 'Line' => dfa($currentState, 'line'), 'Caller' => !$nextState ? '' : df_cc_method($nextState), 'Callee' => !$currentState ? '' : df_cc_method($currentState)]; } df_report('bt-{date}-{time}.log', print_r($compactBT, true)); }
/** * @param string|array(object, string) $method * @param string|string[]|null $params [optional] * @return string */ public function makeKey($method, $params = null) { /** * Иногда первым параметром вместо __METHOD__ передаётся array($this, __FUNCTION__). * Это позволяет сохранить уникальность ключа, * когда вызов makeKey() производится в родительском классе. * Ведь в таком случае __METHOD__ не будет уникальным значением, * ибо будет содержать имя родительского класса, а не класса-потомка. * А вот значение implode('::', array(get_class($this), __FUNCTION__)) останется уникальным, * ибо будет содержать название класса-потомка, а не родителя. */ if (is_array($method)) { $method = df_cc_method($method[0], $method[1]); } /** @var string[] $keyParts */ $keyParts = []; if ($this->type()) { $keyParts[] = $this->type(); } $keyParts[] = $method; $keyParts[] = df_store()->getCode(); if ($params) { if (is_array($params)) { ksort($params); $params = http_build_query($params); } $keyParts[] = $params; } /** * Обратите внимание, * что ключ кэширования не должен содержать русские буквы и некоторые другие символы, * потому что когда кэш хранится в файлах, * то русские буквы и недопустимые символы будут заменены на символ «_», * и имя файла будет выглядеть как «mage---b26_DF_LOCALIZATION_MODEL_MORPHER________». * Чтобы избавиться от русских букв и других недопустимых символов * при сохранении уникальности ключа, используем функцию @uses md5(). */ return md5(df_ckey($keyParts)); }
/** * @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; }