我有一个像$string = "blah";
如何创建一个具有变量值作为名称的函数? 这可能在PHP吗?
与function $string($args){ ... }
或其他内容类似,并且可以将其称为:
blah($args);
答案 0 :(得分:14)
这可能不是一个好主意,但你可以这样做:
$string = "blah";
$args = "args"
$string = 'function ' . $string . "({$args}) { ... }";
eval($string);
答案 1 :(得分:11)
这听起来不是一个很棒的设计选择,可能值得重新考虑,但是......
如果您使用的是PHP 5.3,则可以使用匿名函数。
<?php
$functionName = "doStuff";
$$functionName = function($args) {
// Do stuff
};
$args = array();
$doStuff($args);
?>
答案 2 :(得分:3)
基于类的解决方案
不管问题多么奇怪(不是顺便说一句),让我们认真考虑一下!拥有一个可以声明函数并使它们真实的类可能会很有用:
<?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 的解决方案类似,但是具有真实的代码(而不是字符串),因此更加方便和可读。
答案 3 :(得分:1)
您可以通过存储在变量中的名称来调用函数,还可以为变量分配函数并使用变量调用它。如果不是您想要的,请解释更多。
答案 4 :(得分:1)
尝试call_user_func_array()