如何在PHP文件中输出JavaScript并嵌入JS代码中的PHP变量?

3

我希望将JS代码片段从PHP文件中分离出来,单独放置在它们自己的文件中,以便使代码更加清晰易于维护。例如,我有以下函数:

function load_script($fieldname)
{
  return
  'var help = function () {alert(' . '"EDITOR HELP:\n\n' . 
                                     'blah blah.\n\n' . 
                                     'more blah blah.\n\n' . 
                                     ');}' . "\n" .
  'var options = { handler: help, title: "Editor help" };' . "\n" .
  'var converter = Markdown.getSanitizingConverter();' . "\n" .
  'var editor = new Markdown.Editor(converter, "-'.$fieldname.'", options);' . "\n" .
  'editor.run();' . "\n";
}

请注意PHP变量$fieldname

这个想法是将JS部分存储在.js文件中。然后,我会将其作为纯文本读取,以便在返回语句中输出。换句话说,就像这样:

function load_script($fieldname)
{
  $output = file_get_contents("load_script.js");
  return $output;
}

显然,问题在于这不会用相应的值代替$fieldname。我目前的想法是通过字符串替换来运行$output
function load_script($fieldname)
{
  $output = file_get_contents("load_script.js");
  $output = str_replace("some_unique_identifier", $fieldname, $output);
  return $output;
}

有没有更好的方法?
编辑:
我应该补充一些背后的动机:
首先,所提供的示例很丑陋,除了最简单的JS片段外,很难维护。容易出错。
第二,当您以这种方式混合时,编辑器在检查语法和高亮方面并不是很有帮助。
第三,将JS独立到自己的文件中使得运行缩小整个站点的缩小脚本变得更加容易(因此您不必手动维护缩小)。

如果您在PHP中使用模板来输出JS数据(数组或字典),则需要使用JSON。 - Srinivas Reddy Thatiparthy
不要将原始的 PHP 数据嵌入到 JS 代码块中。首先使用 json_encode() 将其编码为 JSON 格式,以便生成语法上有效的 JS 代码。只要出现一个语法错误,整个 JS 代码块就会被终止。 - Marc B
@MarcB:我能请你详细解释一下吗?json_encode("my string")不等于"my string"吗?除非包含字符串的变量意外地变成了数组,否则我不明白原始的PHP字符串变量怎么会炸掉JS代码块。换句话说,如果使用json_encode(),你将得到数组的JSON等效物,这将使JS崩溃,因为它期望一个字符串。也许我错过了某些基本的东西。 - martin's
@martin的代码:<?php $name = "Miles O'Brien"; ?> var x = '<?php echo $name ?>'。糟糕,字符串没有结束标记。仅因为一个值没有问题,并不意味着所有值都不会出现问题。调用json_encode只是微不足道的开销,可以保证您不会破坏JS代码。 - Marc B
4个回答

2
您可以使用模板引擎来实现此功能(例如Smarty)。只需在JS文件中使用模板变量替换PHP变量的位置,并通过PHP加载它们即可。
您甚至可以自己编写一个简单的模板引擎,例如:
// in JS file:
function myFunc() {
    alert("hello %s");
}

// in PHP file:
<?PHP
    //... code to open JS file and load into string....
    echo sprintf($contentsOfJSFile, "John Doe");
?>

RESULTING OUTPUT: 

function myFunc() {
    alert("hello John Doe");
}

我喜欢在只有一个变量需要填充的情况下使用sprintf()的想法。这非常简洁。这是那种“为什么我没想到”的事情之一。然而,在具有多个变量的脚本的情况下,由于sprintf()参数顺序的潜在风险,我更喜欢子字符串匹配替换。 - martin's
在这种情况下,您可以使用与您在问题中列出的相同概念,并使用str_replace()。我只是会将其加强一些,通过将其添加到循环中,该循环遍历一个数组,其中键是JS模板中的变量名称,而值是您要替换的内容。 - dmarra

1

正如某人已经提到的,JS文件就像HTML文件一样,而HTML文件又像PHP文件一样。因此,请按照以下方式创建您的JavaScript文件。

<?php
//my_script.php
?>

<script>
 var foo = "<?= $bar ?>";
</script>

然后,在您的 PHP 代码中:

$bar = 'some value';
include('my_script.php');

这段代码相当干净,但是它将 PHP 嵌入到“HTML”中,而不是反过来。对于简单的事情来说这没问题,但是在复杂的应用程序中会导致问题,因为你希望将视图代码与逻辑代码分离。通常你希望 PHP 输出 HTML 而不被包含在其中,有很多好的理由。 - speakingcode
@speakingcode:我通常将上面的代码片段作为我的视图文件。我想可能有一些原因你不想这样做,那么你可能需要使用一些模板引擎。 - Ayush
我更喜欢在JS文件中使用“干净”的JS。 - martin's

0
简而言之,输出js与输出html相同。您可以嵌入php变量,但是在转义引号和字面值与引用方面需要遵守相同的规则。这可能会很快变得丑陋和繁琐。
我的做法取决于JS和变量的数量。有时我为所有的js制作字符串,然后将它们粘合在一起,像这样:
$js_function_pt1 = "var help = function() { ..."
$js_function_pt2 = "..."

return $js_function_pt1 + $fieldname + $js_function_pt2 + ....

如果你能在JS中保留所有单引号,那么你就有了一点额外的奢侈,可以用双引号括起来JS输出,然后PHP中的变量引用将被解释为变量并进行评估。

$output = " var help = function() { alert('blah blah $fieldname') } "

0

很遗憾,实际上并不是这样的,或者至少不能直接使用。有一些聪明的解决方案,比如Backbone,可能会让你的任务更容易或更合理,但也可能需要重写。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接