PHP无法找到动态生成的函数

时间:2018-02-09 08:51:03

标签: php file

注意:虽然尝试解决WordPress问题时遇到问题,但现在遇到的问题(请参阅下面的“当前方法”)显然是一个PHP问题,这就是为什么它已被发布这里。

TL; DR:

我在文件中动态生成PHP代码,并在完成编写后包含该文件,但PHP无法从文件内部调用函数 - 即使直接包含它而不进行任何更改。

前言

我一直致力于在WordPress中动态生成短代码的系统,并且在此过程中遇到了一个严重的障碍:注册短代码的功能。

长话短说,我们有一个存储在类似于以下内容的数组中的选项列表:

$array = array(
    0 => array(
        'code' => 'my-shortcode',
        'replacement' => 'replacement_directives_here'
    )
);

我已经有一个处理代码的系统,并且发送根据指令生成适当的输出。它正在调用add_shortcode($shortcode, $callback)工作。

我的第一个策略是以类似于以下的方式使用匿名函数:

foreach ($array as $code => $directions) {
    $GLOBALS['my_shortcode_output'] = my_shortcode_process($directions);

    add_shortcode($code, function() { return $GLOBALS['my_shortcode_output']; });
}

然而,由于全球内容的波动导致连续指令相互覆盖,所以我决定尝试不同的东西......

当前方法

作为一种解决方法,让我需要的信息不断滑落,我决定尝试不同的东西:

  • 在我的插件中创建文件
  • 写出我想要包含的函数的PHP代码,以确保它们能够生成正确的输出
  • fclose()来电之后>包含文件
  • 注册短代码,引用新文件中的功能

生成文件的代码如下所示:

$file = fopen(PATH_TO_FILE, 'w'); // Open for writing only, truncate file on opening
fwrite($file, "<?php\n\n"); // Using double quotes so newlines and escapes don't get counted as literals

// foreach through list
foreach ($shortcode_list as $shortcode) {
    if ($shortcode['code'] != '') {
        // Append new function with a dynamic name (e.g. $shortcode[code]._sc') to dynamic_shortcodes.php
        // Function should consist of: return my_shortcode_process($shortcode['replacement']);
        // Hard-coding so we don't get frozen if information gets changed
        $new_function = "\tfunction str_replace('-', '_', $shortcode['code'])."_sc() {\n\t\treturn my_shortcode_process('".$shortcode['replacement']."');\n\t}\n\n";

        fwrite($file, $new_function);

        // Add function name to $shortcode_functions array, keyed on the shortcode
        $shortcode_functions[$shortcode['code']] = str_replace('-', '_', $shortcode['code']).'_sc';
    }
}

fclose($file); // Close the file, since we are done writing to it
touch(PATH_TO_FILE); // Ensure the file's modification time is updated

之后,它只是一个简单的循环来注册它们:

foreach ($shortcode_functions as $shortcode => $callback) {
    add_shortcode($shortcode, $callback);
}

然而,当我重新加载并运行所有内容时,我得到以下内容:

  

注意: do_shortcode_tag调用不正确。尝试在没有有效回调的情况下解析短代码: [SHORTCODE HERE] 。有关详细信息,请参阅WordPress中的调试。

我已经下载了文件并验证了其内容 - 所有内容都在PHPstorm中检出。它格式正确,没有语法错误,并且它所依赖的函数已经加载并且工作正常。

甚至跳过整个过程,只是直接包含文件然后调用其中的一个函数是行不通的。这就像文件被黑名单​​一样。但是,同时,include()和require()都不会产生任何错误。

这可能是一个缓存问题吗?

1 个答案:

答案 0 :(得分:1)

老实说,我完全无法理解您尝试做什么(甚至为什么),但PHP对动态生成的包含没有任何问题。这很好用:

<?php

$file = __DIR__ . '/foo-' . mt_rand(0, PHP_INT_MAX) . '.php';
$code = '<?php

function foo() {
    echo "Hello, World!";
};
';
file_put_contents($file, $code);

require $file;
foo();

但是,您显然正在尝试执行以下操作:

function str_replace('-', '_', $shortcode['code'])."_sc(){
}

在主脚本中的包含文件中,这是一个明显的语法错误。如果您按照请参阅WordPress中的调试以获取更多信息说明,您可能会发现类似的内容:

  

解析错误:语法错误,意外&#39;&#39;&#39;&#39;&#39; (T_CONSTANT_ENCAPSED_STRING),期待变量(T_VARIABLE)

variable functions的语法可以是:

$name = str_replace('-', '_', $shortcode['code']) . '_sc';
$name = function (){
};