【问题标题】:php create function from string valuephp从字符串值创建函数
【发布时间】:2011-02-13 09:54:31
【问题描述】:

我只是想创建一个带有字符串值的函数名。

类似这样的:

$ns = 'test';
function $ns.'_this'(){}
test_this();

当然会报错。

我试过了:

function {$ns}.'_this'
function {$ns.'_this'}

但没有运气。

有什么想法吗?

【问题讨论】:

    标签: php user-defined-functions


    【解决方案1】:

    您可以使用create_function 从提供的字符串创建函数。

    示例(php.net)

    <?php
    $newfunc = create_function('$a,$b', 'return "ln($a) + ln($b) = " . log($a * $b);');
    echo "New anonymous function: $newfunc\n";
    echo $newfunc(2, M_E) . "\n";
    // outputs
    // New anonymous function: lambda_1
    // ln(2) + ln(2.718281828459) = 1.6931471805599
    ?>
    

    【讨论】:

    • 对,我看过了。我仍然希望能够以传统方式调用该函数,这是不允许的。
    【解决方案2】:

    这是不可能的。如果您只想为所有函数添加一些公共字符串的前缀,也许您想使用命名空间?

    namespace foo {
        function bar() {}
        function rab() {}
        function abr() {}
    }
    // access from global namespace is as follows:
    namespace {
        foo\bar(); foo\rab(); foo\abr();
    }
    

    【讨论】:

    • ehhh,我已经走上了命名空间的道路。我告诉你,php 命名空间很糟糕。无论如何,我想这就是我想知道的是它不能完成。
    【解决方案3】:

    带有函数的文件 (somefile.php)

    function outputFunctionCode($function_name)
    {?>
        function <?php echo $function_name ?>()
        {
        //your code
        }
    <?php }
    

    包含“声明”函数的代码的文件:

    ob_start();
    include("somefile.php");
    outputFunctionCode("myDynamicFunction");
    $contents = ob_get_contents();
    ob_end_clean();
    $file = fopen("somefile2.php", "w");
    fwrite($file,$contents);
    fclose($file);
    include("somefile2.php");
    

    这很丑,但话说回来,用动态名称声明函数是一个非常糟糕的主意。

    【讨论】:

    • 同意,虽然丑陋,但确实符合 OP 的要求
    【解决方案4】:

    使用“eval”不是一个好习惯,但有时可能会达到与您的要求相似的目的。

       <?php
    
     $ns = 'test';
     $funcName = $ns.'_this';
        eval("function $funcName(){ echo 1;}");
        test_this();
    
    ?>
    

    【讨论】:

      【解决方案5】:

      这是你要找的吗?

      <?php
      
      function foo($a) {   print 'foo called'.$a; }
      
      $myfunctionNameStr = 'foo';
      
      $myfunctionNameStr(2);
      
      ?>
      

      因为我认为您不能动态地构造函数声明。不过,您可以在“运行时”决定 $myfunctionNameStr 的值。

      【讨论】:

        猜你喜欢
        • 2011-06-17
        • 2023-04-09
        • 2015-09-30
        • 1970-01-01
        • 2022-01-24
        • 2011-08-31
        • 2015-05-28
        • 1970-01-01
        • 2017-12-15
        相关资源
        最近更新 更多