web-dev-qa-db-fra.com

Peut-on alias une fonction dans php?

est-il possible d'aliaser une fonction avec un nom différent en PHP? si oui comment?

supposons que nous ayons cette fonction sleep ();

existe-t-il un moyen rapide de créer un alias appelé wait (); 

sans écrire ce code

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

PHP 5.6+ seulement

À partir de PHP 5.6 il est possible d’aliaser une fonction en l’important:

use function sleep as wait;
48
Jon

Jusqu'au PHP 5.5

oui, function wait ($seconds) { sleep($seconds); } est la voie à suivre. Mais si vous craignez de devoir changer wait () si vous devez changer le nombre de paramètres de sleep (), vous voudrez peut-être procéder comme suit:

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

Non, mais vous pouvez le faire:

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

De cette façon, vous résolvez également les problèmes d'argumentation

26

Vous pouvez aussi regarder lambdas si vous avez PHP 5.3

$wait = function($v) { return sleep($v); };
20
Ólafur Waage

Si vous n'êtes pas préoccupé par l'utilisation de l'instruction "eval" de PHP (que beaucoup de gens ont un réel problème, mais ce n'est pas mon cas), vous pouvez utiliser quelque chose comme ceci:

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

Je l'ai utilisé dans certains simples tests, et cela a semblé fonctionner assez bien. Voici un exemple:

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

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

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

greeting('World');
greetingMars();
9
Nathan Crause

Non, il n'y a pas de moyen rapide de faire cela en PHP. Le langage n’offre pas la possibilité d’aliaser des fonctions sans écrire une fonction wrapper.

Si vous en aviez vraiment besoin, vous pourriez écrire une extension PHP qui le ferait pour vous. Cependant, pour utiliser l'extension, vous devez compiler votre extension et configurer PHP pour nous, ce qui signifie que la portabilité de votre application serait considérablement réduite.

7
Alan Storm

Non, les fonctions ne sont pas des citoyens de première classe, il n'y a donc pas de wait = sleep comme Javascript, par exemple. Vous devez essentiellement faire ce que vous avez mis dans votre question:

function wait ($seconds) { sleep($seconds); }
5
Greg
5
user187291
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); // -> …
4
sam

Si votre PHP ne prend pas en charge utilisez x comme syntaxe y, dans l'ancienne version PHP vous pouvez définir fonction anonyme :

$wait = create_function('$seconds', 'sleep($seconds);');
$wait(1);

Ou placez le code dans la constante, par exemple:

define('wait', 'sleep(1);');
eval(wait);

Voir aussi: Que puis-je utiliser à la place de eval ()?

Ceci est particulièrement utile si vous avez un long morceau de code et que vous ne voulez pas le répéter ou si le code n'est pas utile pour une nouvelle fonction.


Il y a aussi une fonction publiée par Dave H , ce qui est très utile pour créer un alias d'une fonction utilisateur:

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; 
}
2
kenorb

nan. la façon dont vous avez écrit est la meilleure façon de le faire.

1
GSto

Non, il n’existe pas de moyen rapide de le faire - du moins pour tout ce qui a été fait auparavant PHP v5.3, et ce n’est pas une très bonne idée de le faire non plus. Cela complique simplement les choses. 

1
Alister Bulman

Depuis PHP 5.6

Ceci est particulièrement utile pour les classes utilisant des méthodes magiques.

class User extends SomethingWithMagicMethods {

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

}

Mais je suis sûr que cela fonctionne aussi avec les fonctions habituelles.

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

Source: PHP: Nouvelles fonctionnalités -> "Fonctions variadiques via ..."

0
Nathan J. Brauer