如何动态创建函数?

时间:2011-12-18 02:48:15

标签: php function

我有一个像$string = "blah";

这样的变量

如何创建一个具有变量值作为名称的函数? 这可能在PHP吗?

function $string($args){ ... }或其他内容类似,并且可以将其称为:

blah($args);

5 个答案:

答案 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()

php.net link