如何在PHP中为函数添加别名?
是否可以在PHP中使用不同名称的函数别名?假设我们有一个名为如何在PHP中为函数添加别名?,php,function,alias,Php,Function,Alias,是否可以在PHP中使用不同名称的函数别名?假设我们有一个名为sleep的函数。有没有办法让别名等待 现在我是这样做的: function wait( $seconds ) { sleep($seconds); } function func_alias($target, $original) { eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original'
sleep
的函数。有没有办法让别名等待
现在我是这样做的:
function wait( $seconds ) {
sleep($seconds);
}
function func_alias($target, $original) {
eval("function $target() { \$args = func_get_args(); return call_user_func_array('$original', \$args); }");
}
没有。您编写的方法是最好的方法。不,没有快速的方法可以做到这一点-至少对于PHPV5.3之前的任何东西,这样做也不是一个特别好的主意。这只会使事情复杂化 不,函数不是一等公民,因此没有像Javascript这样的
wait=sleep
。你基本上必须做你在问题中提出的事情:
function wait ($seconds) { sleep($seconds); }
不,在PHP中没有快速实现这一点的方法。该语言不提供在不编写包装器函数的情况下对函数进行别名的功能
如果你真的需要这个,你可以这样做。但是,要使用扩展,您需要编译扩展并将PHP配置为该扩展,这意味着您的应用程序的可移植性将大大降低。不,但您可以这样做:
$wait = 'sleep';
$wait($seconds);
通过这种方式,在PHP 5.5之前,您还可以解决参数编号问题
是的,函数wait($seconds){sleep($seconds);}
是一种方法。但是,如果您担心必须更改wait(),如果您更改sleep()的参数数量,则可能需要执行以下操作:
function wait() {
return call_user_func_array("sleep", func_get_args());
}
如果您有PHP5.3,您可以查看
$wait = function($v) { return sleep($v); };
您可以使用runkit扩展
如果您不关心使用PHP的“eval”指令(很多人对此有实际问题,但我没有),那么您可以使用以下内容:
function wait( $seconds ) {
sleep($seconds);
}
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 5.6+
可以通过导入函数来对其进行别名:
use function sleep as wait;
中还有一个示例(请参见“为函数添加别名”)。我在类中使用的
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);
}
如果您的PHP不支持语法,则在旧版PHP中,您可以定义: 或将代码放在常数内,例如:
define('wait', 'sleep(1);');
eval(wait);
另见:
如果您有一段很长的代码,并且不想重复它,或者代码对新函数也不有用,那么这一点尤其有用
还有一个函数POST by,它对于创建用户函数的别名非常有用:
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;
}
我知道这很古老,但你可以一直
$wait = 'sleep';
$wait();
从PHP5.6开始
这对于在具有魔术方法的类中使用尤其有用
class User extends SomethingWithMagicMethods {
public function Listings(...$args) {
return $this->Children(...$args);
}
}
但我很确定它也适用于常规函数
function UserListings(...$args) {
return UserChildren(...$args);
}
资料来源:
您不必重新编译php。你可以编译这个模块,并通过php.ini包含它。非常正确的凯文,我已经更新了帖子以反映你的评论。不过,变量可能会变得非常混乱。我不认为这是解决问题的最好办法。@GSto这不是最好的办法。这只是一种可能性。我简直不敢相信它被提升了这么多:-)在PHP中有多少其他字符串内容是以这种方式被替换的?看起来像是集成到每个变量中的
eval()
。就像将解析器、预处理器和解释器混合到一种设计非常糟糕的语言中一样。注意:我不是PHP程序员(C++、Python和Javascript)。这些类型的结构是我当年开始使用PHP的原因。简单易懂,任何事情都有可能。仍然喜欢它。func\u get\u args()
只有在PHP>5.3中才能这样工作,在PHP>5.3中,您可以在参数列表中使用它。在PHP<5.3中,必须使用一个临时变量:$args=func_get_args();返回call\u user\u unc\u数组('sleep',$args)代码>这是我的首选答案,因为它还允许您在类内别名一个静态方法,如下所示:call_user_func_array(array(“class”,“staticMethod”),func_get_args())@FriendlyDev您不能只使用调用用户函数数组(“类::staticMethod”,func\u get\u args())代码>相反?或者如果你真的想成为一名花花公子,返回sleep(…func_get_args())
@AbiusX我有一个函数,其中第一个变量是通过引用的,因此这适用于函数v(&$v){return Validate($v,…array_slice(func_get_args(),1));}
如何查找类的方法?以下是我知道的别名类的方法的所有方法(包括坏方法),静态和非静态:正确-我希望能够在我自己的类中为使用该类的人提供有用的别名。有时这是一种优雅的弃用方式(例如,框架的前一个版本有一个拼写错误的方法),而有时这只是一种很好的UX。如果在过程上下文中包含的文件中使用,它似乎无法全局工作。@VincentPoirier导入是每个文件,另一个文件不可能为您重新定义函数。这是否等同于?@Pang是的,但我的记忆力不太好,无法回答几个月前我为什么这么做。