Intereting Posts
Как «разблокировать» поле в форме CakePHP, когда оно является частью ассоциации hasMany Как обратиться к public_html корневому файлу, используя include, после того, как вы перейдете к одной файловой директории из public_html Использование count (*) vs num_rows как шифровать, а затем расшифровывать текст имени пользователя и пароля, используемых в файле класса базы данных PHP – Как получить частичный вывод при выполнении скрипта? Форматировать код MySQL внутри строки PHP защита изображений в кодеринговом Переходы Doctrine можно использовать в производственных приложениях? PHP – CSRF – Как заставить его работать во всех вкладках? синтаксическая ошибка в mysql с php с использованием внутреннего соединения Как использовать «Простой доступ API для доступа к Google» для доступа к информации Календаря Google (PHP)? .htaccess очистить URL с более чем тремя паразитами Не удается получить токен из Uber API с ключом действительного доступа Как автоматически перенаправить пользователя в Symfony после таймаута сеанса? Операторы динамического сравнения в PHP

Можем ли мы использовать функцию php?

возможно ли псевдоним функции с другим именем в PHP? если да, то как?

предположим, что у нас есть эта функция sleep ();

есть ли быстрый способ сделать псевдоним wait ();

без написания этого кода

function wait ($seconds) { sleep($seconds); } 

Related of "Можем ли мы использовать функцию php?"

Только PHP 5.6+

Начиная с PHP 5.6, можно выполнить псевдоним функции, импортировав его:

 use function sleep as wait; 

До PHP 5.5

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(); 

Начиная с PHP 5.6

Это особенно полезно для использования в классах с магическими методами.

 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); }