возможно ли псевдоним функции с другим именем в PHP? если да, то как?
предположим, что у нас есть эта функция sleep ();
есть ли быстрый способ сделать псевдоним wait ();
без написания этого кода
function wait ($seconds) { sleep($seconds); }
Начиная с PHP 5.6, можно выполнить псевдоним функции, импортировав его:
use function sleep as wait;
yup, function wait ($seconds) { sleep($seconds); }
function wait ($seconds) { sleep($seconds); }
– это путь. Но если вы беспокоитесь о необходимости изменить wait (), если вы измените количество параметров для sleep (), тогда вы можете сделать следующее:
function wait() { return call_user_func_array("sleep", func_get_args()); }
Нет, но вы можете это сделать:
$wait = 'sleep'; $wait($seconds);
Таким образом, вы также разрешаете аргументы-число-проблемы
Вы также можете посмотреть на лямбда, если у вас есть PHP 5.3
$wait = function($v) { return sleep($v); };
Если вас не интересует использование PHP-инструкции «eval» (с которой у многих людей есть реальная проблема, но я этого не делаю), вы можете использовать что-то вроде этого:
function func_alias($target, $original) { eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }"); }
Я использовал его в некоторых простых тестах, и, похоже, он работал довольно хорошо. Вот пример:
function hello($recipient) { echo "Hello, $recipient\n"; } function helloMars() { hello('Mars'); } func_alias('greeting', 'hello'); func_alias('greetingMars', 'helloMars'); greeting('World'); greetingMars();
Нет, в PHP нет быстрого способа сделать это. Язык не предоставляет возможности для функций псевдонима без написания функции обертки.
Если вам действительно действительно нужно это, вы можете написать расширение PHP , которое сделает это за вас. Тем не менее, чтобы использовать расширение, вам необходимо скомпилировать расширение и настроить для нас это расширение, что означает, что переносимость вашего приложения будет значительно уменьшена.
Нет, функции не являются гражданами 1-го класса, поэтому нет wait = sleep
например, Javascript. Вы в основном должны делать то, что вы задали в своем вопросе:
function wait ($seconds) { sleep($seconds); }
вы можете использовать расширение runkit
http://us.php.net/manual/en/function.runkit-function-copy.php
function alias($function) { return function (/* *args */) use ($function){ return call_user_func_array( $function, func_get_args() ); }; } $uppercase = alias('strtoupper'); $wait = alias('sleep'); echo $uppercase('hello!'); // -> 'HELLO!' $wait(1); // -> …
Если ваш PHP не поддерживает использование x в качестве синтаксиса y , в старой версии PHP вы можете определить анонимную функцию :
$wait = create_function('$seconds', 'sleep($seconds);'); $wait(1);
Или поместите код внутри константы, например:
define('wait', 'sleep(1);'); eval(wait);
См. Также: Что я могу использовать вместо eval ()?
Это особенно полезно, если у вас длинный фрагмент кода, и вы не хотите его повторять, или код не полезен для новой функции.
Существует также функция, размещенная Dave H, которая очень полезна для создания псевдонима пользовательской функции:
function create_function_alias($function_name, $alias_name) { if(function_exists($alias_name)) return false; $rf = new ReflectionFunction($function_name); $fproto = $alias_name.'('; $fcall = $function_name.'('; $need_comma = false; foreach($rf->getParameters() as $param) { if($need_comma) { $fproto .= ','; $fcall .= ','; } $fproto .= '$'.$param->getName(); $fcall .= '$'.$param->getName(); if($param->isOptional() && $param->isDefaultValueAvailable()) { $val = $param->getDefaultValue(); if(is_string($val)) $val = "'$val'"; $fproto .= ' = '.$val; } $need_comma = true; } $fproto .= ')'; $fcall .= ')'; $f = "function $fproto".PHP_EOL; $f .= '{return '.$fcall.';}'; eval($f); return true; }
Неа. способ, которым вы написали, – лучший способ сделать это.
Нет, нет быстрого способа сделать это – по крайней мере, для чего-либо перед PHP v5.3, и это тоже не очень хорошая идея. Это просто усложняет ситуацию.
Я знаю, что это старо, но всегда можно
$wait = 'sleep'; $wait();
Это особенно полезно для использования в классах с магическими методами.
class User extends SomethingWithMagicMethods { public function Listings(...$args) { return $this->Children(...$args); } }
Но я уверен, что он работает и с обычными функциями.
function UserListings(...$args) { return UserChildren(...$args); }
Источник: PHP: Новые функции -> «Функции Variadic через …»
Что я использовал в своем классе
function __call($name, $args) { $alias['execute']=array('done','finish'); $alias['query']=array('prepare','do'); if (in_array($name,$alias['execute'])){ call_user_func_array("execute",$args); return TRUE; }elseif(in_array($name,$alias['query'])){ call_user_func_array("query",$args); return TRUE; } die($this->_errors.' Invalid method:'.$name.PHP_EOL); }