Подтвердить что ты не робот

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

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

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

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

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

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

Ответ 1

Только PHP 5.6+

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

use function sleep as wait;

Ответ 2

До PHP 5.5

yup, function wait ($seconds) { sleep($seconds); } - это путь. Но если вы беспокоитесь о необходимости изменить wait(), если вы измените количество параметров для sleep(), вместо этого вы можете сделать следующее:

function wait() { 
  return call_user_func_array("sleep", func_get_args());
}

Ответ 3

Нет, но вы можете сделать это:

$wait = 'sleep';
$wait($seconds);

Таким образом вы также разрешаете аргументы-число-проблемы

Ответ 4

Вы можете посмотреть lambdas, если у вас есть PHP 5.3

$wait = function($v) { return sleep($v); };

Ответ 5

Если вас не интересует использование инструкции PHP eval (с которой у многих людей есть реальная проблема, но я этого не делаю), вы можете использовать что-то вроде этого:

function func_alias($target, $original) {
    eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }");
}

Я использовал его в некоторых тестах simple, и, похоже, он работал достаточно хорошо. Вот пример:

function hello($recipient) {
    echo "Hello, $recipient\n";
}

function helloMars() {
    hello('Mars');
}

func_alias('greeting', 'hello');
func_alias('greetingMars', 'helloMars');

greeting('World');
greetingMars();

Ответ 6

Нет, нет быстрого способа сделать это в PHP. Язык не предоставляет возможности для функций псевдонима без написания оберточной функции.

Если вам действительно действительно нужно это, вы можете написать расширение PHP, которое сделает это за вас. Тем не менее, для использования расширения вам нужно будет скомпилировать расширение и настроить для него это расширение, что означает, что переносимость вашего приложения будет значительно уменьшена.

Ответ 7

Нет, функции не являются гражданами 1-го класса, поэтому нет wait = sleep, например, Javascript. Вы в основном должны делать то, что вы задали в своем вопросе:

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

Ответ 9

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); // -> …

Ответ 10

Если ваш 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; 
}

Ответ 11

Нету. способ, которым вы написали, - лучший способ сделать это.

Ответ 12

Нет, нет быстрого способа сделать это - по крайней мере, для чего-либо перед PHP v5.3, и это тоже не очень хорошая идея. Это просто усложняет ситуацию.

Ответ 13

Я знаю, что это старый, но вы всегда можете

$wait = 'sleep';
$wait();

Ответ 14

Начиная с PHP 5.6

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

class User extends SomethingWithMagicMethods {

    public function Listings(...$args) {
        return $this->Children(...$args);
    }

}

Но я уверен, что он работает и с обычными функциями.

function UserListings(...$args) {
    return UserChildren(...$args);
}

Источник: PHP: Новые функции → "Функции Variadic через..."

Ответ 15

Что я использовал в своем классе

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