我有一个简单的 Email() 类。它用于从我的网站发送电子邮件。
<?
Email::send($to, $subj, $msg, $options);
?>
我还有一堆用纯 HTML 编写的电子邮件模板,其中包含一些 PHP 变量。例如/inc/email/templates/account_created.php
:
<p>Dear <?=$name?>,</p>
<p>Thank you for creating an account at <?=$SITE_NAME?>. To login use the link below:</p>
<p><a href="https://<?=$SITE_URL?>/account" target="_blank"><?=$SITE_NAME?>/account</a></p>
为了渲染 PHP 变量,我必须include
将模板放入我的函数中。但由于include
不返回内容,而是直接将其发送到输出,我不得不用缓冲区函数包装它:
<?
abstract class Email {
public static function send($to, $subj, $msg, $options = array()) {
/* ... */
ob_start();
include '/inc/email/templates/account_created.php';
$msg = ob_get_clean();
/* ... */
}
}
之后我意识到 PHP vars 没有被渲染,因为它们在函数范围内,所以我必须在模板内全局化变量:
<?
global $SITE_NAME, $SITE_URL, $name;
?>
<p>Dear <?=$name?>,</p>
...
所以问题是是否有更优雅的解决方案?主要是我担心我使用ob_start()
and的解决方法global
。出于某种原因,这在我看来很奇怪。或者这几乎是常见的做法?