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);
}
À partir de PHP 5.6 il est possible d’aliaser une fonction en l’important:
use function sleep as wait;
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());
}
Non, mais vous pouvez le faire:
$wait = 'sleep';
$wait($seconds);
De cette façon, vous résolvez également les problèmes d'argumentation
Vous pouvez aussi regarder lambdas si vous avez PHP 5.3
$wait = function($v) { return sleep($v); };
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();
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.
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); }
vous pouvez utiliser l'extension 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); // -> …
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;
}
nan. la façon dont vous avez écrit est la meilleure façon de le faire.
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.
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 ..."