我有一个变量,例如$string = "blah";
如何创建一个以变量值为名称的函数?在PHP中是否可能实现?
例如:function $string($args){ ... }
或类似的方法,并能够像这样调用:
blah($args);
我有一个变量,例如$string = "blah";
如何创建一个以变量值为名称的函数?在PHP中是否可能实现?
例如:function $string($args){ ... }
或类似的方法,并能够像这样调用:
blah($args);
这可能不是一个好主意,但你可以这样做:
$string = "blah";
$args = "args"
$string = 'function ' . $string . "({$args}) { ... }";
eval($string);
get_defined_functions()['user']
和 get_defined_vars()
看看它们之间的区别。 - jameshfisher那听起来不像是一个很好的设计选择,它可能值得重新考虑,但是...
如果您正在使用 PHP 5.3,您可以使用匿名函数。
<?php
$functionName = "doStuff";
$$functionName = function($args) {
// Do stuff
};
$args = array();
$doStuff($args);
?>
get_defined_functions()['user']
和 get_defined_vars()
来查看区别。 - jameshfisherfunction
。当然,这并没有定义一个命名函数,但我认为它超越了吹毛求疵的程度,到达了不合理的地步,说它根本没有定义一个“函数”。 - Mark Amery$foo = function () { ... }; $foo();
。就这样。 - mms27无论这个问题有多奇怪(实际上不是),让我们认真对待它一会儿!拥有一个能够声明函数并使其成为现实的类可能会很有用:
<?php
customFunctions::add("hello", // prepare function "hello"
function($what) {
print "Hello $what, as Ritchie said";
print "<br>";
}
);
customFunctions::add("goodbye", // prepare function "goodbye"
function($what,$when) {
print "Goodbye cruel $what, ";
print "I'm leaving you $when";
print "<br>";
}
);
eval(customFunctions::make()); // inevitable - but it's safe!
完成了!现在它们是真正的函数。没有$前缀,也不会在每次调用时运行时评估 - eval()仅在声明时需要一次。之后,它们像任何函数一样工作。
让我们试试它们:
hello('World'); // "Hello World"
goodbye('world','today'); // "Goodbye cruel world, I'm leaving you today"
这是能够完成此操作的类。真的不是一个复杂的类:
class customFunctions {
private static $store = [];
private static $maker = "";
private static $declaration = '
function %s() {
return call_user_func_array(
%s::get(__FUNCTION__),
func_get_args()
);
}
';
private static function safeName($name) {
// extra safety against bad function names
$name = preg_replace('/[^a-zA-Z0-9_]/',"",$name);
$name = substr($name,0,64);
return $name;
}
public static function add($name,$func) {
// prepares a new function for make()
$name = self::safeName($name);
self::$store[$name] = $func;
self::$maker.=sprintf(self::$declaration,$name,__CLASS__);
}
public static function get($name) {
// returns a stored callable
return self::$store[$name];
}
public static function make() {
// returns a string with all declarations
return self::$maker;
}
}
它为您的函数提供了内部存储,并声明“真正”的函数来调用它们。这类似于fardjad的解决方案,但使用真正的代码(而不是字符串),因此更加便捷和易读。