簡體   English   中英

PHP找不到動態生成的函數

[英]PHP can't find dynamically generated function

注意:雖然該問題是在試圖解決 WordPress 問題時發生的,但現在面臨的問題(請參閱下面的“當前方法”)顯然是 PHP 問題,這就是將其發布在這里的原因。

特爾;博士:

我在文件中動態生成 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() 都不會產生任何錯誤。

這可能是緩存問題嗎?

老實說,我完全無法理解您要做什么(甚至為什么),但 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 中調試以獲取更多信息說明,您可能會找到類似的內容:

解析錯誤:語法錯誤,意外的“-”(T_CONSTANT_ENCAPSED_STRING),需要變量(T_VARIABLE)

有效的變量函數的語法可能是:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM