php嵌套heredoc和转义变量

时间:2017-07-31 13:00:20

标签: php heredoc

我正在使用heredoc创建一个php文件,需要在生成的文件中使用heredoc,因为该文件将创建其他文件。

<<<EOD位工作正常,我可以看到所有变量都已正确转义。

我遇到的问题是嵌套的heredoc <<<EOL \$languageStrings未被转义

如果我使用\$languageStrings并运行生成的文件ddd.php,则输出为:

<?php
 = Array (
    'LBL_LOCATION_INFORMATION' => 'Basic Information',
    'LBL_CUSTOM_INFORMATION' => 'Custom Information',
    'SINGLE_' => ''
);

如果我使用\\$languageStrings试图用esacpe得到反斜杠:

<?php
\ = Array (
    'LBL_LOCATION_INFORMATION' => 'Basic Information',
    'LBL_CUSTOM_INFORMATION' => 'Custom Information',
    'SINGLE_' => ''
);

我如何更正此问题,以便获得$languageStrings = Array (?我确实考虑过尝试打开文件并插入特定行,但文件总是不同。

我愿意接受建议

这是我的heredoc的一个例子     

$text = <<<EOD
This is some text
This is some more text

This is a \$variable //outputs this is a $variable

This is some more text
EOD;

$text .= <<<EOD
\n
\$targetpath = 'modules/' . \$moduleInstance->name;

if (!is_file(\$targetpath)) {
    mkdir(\$targetpath);
    mkdir(\$targetpath . '/language');
    // create the language file
    \$languagepath = 'languages/en_us';

    \$languageContents = <<<EOL
<?php
\$languageStrings = Array (
    'LBL_LOCATION_INFORMATION' => 'Basic Information',
    'LBL_CUSTOM_INFORMATION' => 'Custom Information',
    'SINGLE_\$moduleInstance->name' => '\$moduleInstance->name'
);
EOL;

    file_put_contents(\$languagepath . '/' . \$module->name . '.php', \$languageContents);
}
EOD;

file_put_contents('ddd.php', $text);

2 个答案:

答案 0 :(得分:0)

我通过在heredoc

之外创建变量来修复它
$strings = '\$languageStrings';

并将\$languageStrings替换为heredoc字符串中的$strings = Array (

输出是我的预期

答案 1 :(得分:0)

需要单引号,例如 Heredoc 。该名称为 Nowdoc 。 现在,文档将单引号括起来,而文档将双引号括起来。

$foo = "bar";
echo <<<STR
str $foo
STR;

echo <<<'STR'
str $foo
STR;

OR

echo "str $foo";
echo 'str $foo';

预期结果: -> STR栏 -> str $ foo

自PHP 5.3.0起,开头的Heredoc标识符可以选择为双引号

<<<"FOO"
FOO;

相同
<<<FOO
FOO;

尽管可选项,我还是喜欢每次都在heredoc中用双引号表示,以使其易于理解。

医生说:php.net

  

Nowdocs将单引号字符串用作heredocs的字符串   双引号字符串。 nowdoc的指定方式与Heredoc类似,   但是在nowdoc内部不进行任何解析。该结构非常适合   嵌入PHP代码或其他大块文本,而无需   转义。它具有与SGML构造相同的一些功能,因为它声明了一个文本块,该文本块不用于   解析。

     

按与此处文档相同的<<<序列来标识nowdoc,   但是后面的标识符用单引号引起来,例如   <<<'EOT'。 Heredoc标识符的所有规则也适用于nowdoc   标识符,尤其是有关收盘外观的标识符   标识符。