0]; protected $callback_filters = []; protected static $current_filter = false; protected function runAction($action, $args) { $function = $action['function']; $argsNumber = $action['arguments']; $args = $this->getArguments($argsNumber, $args); if (is_callable($function)) { return call_user_func_array($function, $args); } elseif (is_array($function) && isset($function[0], $function[1])) { $class = $function[0]; $method = $function[1]; if ($obj = call_user_func([$class, $this->singleton])) { return $obj !== false ? call_user_func_array([$obj, $method], $args) : false; } elseif (class_exists($class)) { $instance = new $class(); return call_user_func_array([$instance, $method], $args); } } return false; } protected function getFilters($tag, $remove) { $filters = isset($this->callback_filters[$tag]) ? $this->callback_filters[$tag] : []; if ($remove) { unset($this->callback_filters[$tag]); } return $filters; } public static function get_properties($type, $is_callback = false) { $that = self::getInstance(self::$id); if ($type === 'event') { return $is_callback ? $that->callbacks : $that->actions; } return $is_callback ? $that->callback_filters : $that->filters; } public static function addFilter($tag, $func, $priority = 8, $args = 0) { $that = self::getInstance(self::$id); $that->callback_filters[$tag][$priority][] = [ 'function' => $func, 'arguments' => $args, ]; return true; } public static function apply_filters($tag, $args = [], $remove = true) { $that = self::getInstance(self::$id); self::$current_filter = $tag; $that->filters['count']++; if (!isset($that->filters[$tag])) { $that->filters[$tag] = 0; } $that->filters[$tag]++; $filters = $that->getFilters($tag, $remove); ksort($filters); $value = isset($args[0]) ? $args[0] : null; foreach ($filters as $priority) { foreach ($priority as $filter) { if (isset($args[0])) { $args[0] = $value; } $replace = $that->runAction($filter, $args); if ($replace !== false) { $value = $replace; } } } self::$current_filter = false; return $value; } protected function getArguments($argsNumber, $arguments) { if ($argsNumber === 1 && is_string($arguments)) { return [$arguments]; } if (is_array($arguments) && $argsNumber === count($arguments)) { return $arguments; } return array_slice((array) $arguments, 0, $argsNumber); } public static function remove_filter($tag, $func, $priority) { $that = self::getInstance(self::$id); return self::remove_callback($that->callback_filters, $tag, $func, $priority); } public static function remove_action($tag, $func, $priority) { $that = self::getInstance(self::$id); return self::remove_callback($that->callbacks, $tag, $func, $priority); } private static function remove_callback(&$array, $tag, $func, $priority) { if (!isset($array[$tag][$priority])) { return false; } foreach ($array[$tag][$priority] as $key => $value) { if (isset($value['function']) && $value['function'] === $func) { unset($array[$tag][$priority][$key]); return true; } } return false; } }