0

我有这样的课:

class main {

    private static $content;

    public function ini() {
        include 'content_a.php';
        self::$content = new $content;
    }

    public function content($snippet, $addclass=false) {
        return self::$content->snippet;
    }
}

它解析一些输入并确定要包含在 ini() 中的文件,该文件在每个页面加载的顶部运行一次。在此示例中,它包括content_a.php,但还有更多 ( content_b.php, content_c.php, ...)。该方法将文件的内容保存到 $content 属性以供 content() 使用,该方法在脚本的其余部分被多次调用。

文件 content_a.php 如下所示:

class content {
    public $text = <<<FOO
    <div class="default $addclass">Hello World</div>
FOO;
}

无论是 a、b 还是 c,它看起来总是一样的——只是heredoc 中的实际内容不同。每个文件包含多个片段;在此示例中,只有一个 ( $text)。

我正在渲染这样的片段:

echo $main->content('text');

...效果很好。但是,当我尝试通过这样的参数时$addclass......

echo $main->content('text', 'bar');

...我得到了错误unexpected T_VARIABLE, expecting T_END_HEREDOC。如果我将变量括在大括号中,我会得到unexpected T_CURLY_OPEN, expecting T_END_HEREDOC.

任何想法我做错了什么 - 还是有更好的方法来做到这一点?

4

2 回答 2

1

在 PHP 中不允许在类变量中使用表达式,当将其分配给类变量时,您只能在 heredoc 中使用静态内容

因此您可以使用 %s 代替 $addclass 然后使用 sprintf($this->text,$addClass); 替换它

于 2013-11-11T21:43:22.067 回答
0

我为我的情况找到了最好的方法。Solaiman 的回答在技术上可行,但我也希望它具有可扩展性,即我希望能够为不同的片段传递不同的变量。一个可能有一个附加的类,而另一个,例如一个链接,可能有一个动态href属性。

所以我采取了以下措施:

  • 用 $text 中的 %%variable%% 替换 $variable
  • 在返回 $text 之前运行一个快速的 str_replace()

目前,这似乎是最具可扩展性和灵活性的。不过,如果有人可以提供其他解决方案,我仍然愿意接受其他解决方案。

再次感谢 Solaiman 的回答。

于 2013-11-11T23:38:30.233 回答