为什么我可以访问字符串中的PHP对象?

时间:2015-09-30 20:10:22

标签: php string-interpolation

这是一些用于呈现HTML锚元素的PHP代码。为什么这样:

$archives .= "&nbsp;<a href='" . get_year_link($archPost->year) . "' 
title='Click to go to full listing for " . $archPost->year . "' target='_blank'>[List^]</a>";

完全像这样工作:

$archives .= "&nbsp;<a href='" . get_year_link($archPost->year) . "' 
title='Click to go to full listing for $archPost->year' target='_blank'>[List^]</a>";

来自C / C#等,我偏爱第一个变种,因为我认为不能只在字符串中间转储变量smack-dab。显然PHP对此没有任何问题。为什么不呢?

1 个答案:

答案 0 :(得分:3)

这称为字符串插值,它是available in C# as well

就个人而言,我发现使用字符串插值是不好的做法。它使代码难以在IDE中读取,并且可能导致对字符串的误解。 (也许你想要美元符号表示一个美元符号,但因为你使用双引号"而不是单引号',你现在有一个错误。)我连接起来了:

$var = 'something' . $somethingElse;

如果您正在使用echo,那么回显列表会更高效,而不是连接:

echo 'something', $somethingElse;

另一个问题,至少在您的示例中使用的是,您将数据直接转储到HTML的上下文中而不进行转义。如果您的输出包含保留实体,那么您将生成无效的模糊HTML。这甚至可能导致安全问题,具体取决于所使用的上下文,例如XSS问题。您希望在HTML中使用的任意数据周围使用htmlspecialchars()。 (或者,使用为您执行此操作的模板引擎。)