PHP,评估代码产生一个变量


PHP, Eval code result in a variable

我正在使用 eval 来执行来自数据库的 php 代码。该代码用于元标记和页面标题。一个示例如下所示(存储在表中):

$name . " test page title |".SiteSettings::getSiteNameAlternate();

然后在控制器中我这样做($seo是一个具有meta_title的对象,并且该元素具有来自 db 的确切字符串):

$pageTitle = isset($seo->meta_title) ? @eval("echo $seo->meta_title") : null;

我正在使用 Larevel 框架,并将该页面标题传递给刀片模板,这有效。刀片代码

<title>{{ isset($page_title) ? $page_title : SiteSettings::defaultPageTitle() }}</title>

问题是因为评估中的回声我也在页面顶部获得页面标题。

我尝试使用打印(我知道很笨)和printf。没用。知道如何将该 eval 的值放在一个变量中而不在屏幕上输出吗?

$pageTitle = isset($seo->meta_title) ? @eval("return $seo->meta_title;") : null;

如果设置了$seo->meta_title,它将$seo->meta_title分配给$pageTitle,否则null

存储结果的一个好方法是使用ob_start、ob_get_contents和ob_end_clean

/*start buffering;*/
ob_start();
eval(echo isset($seo->meta_title) ? $seo->meta_title : "");
/* now catch the Buffer of the eval */
$pageTitle = ob_get_contents();
/* pageTitle contains now the value of the buffered echo */
/* stop buffering; */
ob_end_clean();

现在根据需要使用控制器

如果我能正确理解您的问题,则会出现该问题是因为您在eval内部进行了一次echo,然后执行该。因此,您应该将 $seo->meta_title 的值存储到变量,然后让视图echo它。

在控制器中,如果isset,将元标题值存储为页面标题,除非null

$pageTitle = null;
if (isset($seo->meta_title)) {
    $metaTitle = '';
    eval("'$metaTitle = '"$seo->meta_title'";");
    $pageTitle = $metaTitle;
}

然后在你看来

<title>{{ isset($page_title) ? $page_title : SiteSettings::defaultPageTitle() }}</title>