2012-12-07 92 views
1

我在我的视图层中使用PHP作为模板语言, 是否可以使下面的一些更清晰和更简洁?PHP模板中的未定义变量

//in temp.phtlm 
<?= (isset($user['name'])) ? $user['name'] : null; ?> 

不幸的是,我们甚至不能定义一个函数,该函数:

// as you know yet a notice is generated when calling function with undefined parameter 
function out($var) 
{ 
     return (isset($var)) ? htmlentities($var) : null; 
} 

回答

1

使用@运营商是最容易的选择。

<?= @$user['name']; ?> 
+0

在PHP中使用'@'是一个不好的习惯。我希望你不会这样。它不是一种替代方法 - 你现在如何将方法应用到'$ user ['name']'? 'htmlentities(@ $ user ['name'])'或'@htmlentities($ user ['name'])'或'@htmlentities(@ $ user ['name'])'?避免使用'@'的简单规则是始终将变量传递给模板。我知道这个解决方案似乎很迷人,但有时候你只需要做一些例程来准备数据以避免这种攻击(我认为'@'应该被认为是'PHP'中的黑客攻击)。只是一个预防措施。 – Nemoden

+0

@Nemoden这是'(isset($ user ['name']))的最佳解决方案? $ user ['name']:null;'在模板中。您可以使用它来代替隐藏通知。 'htmlentities(@ $ user ['name'])或@htmlentities($ user ['name'])或@htmlentities(@ $ user ['name'])'完全可以。实际上,'@'最适合这种情况。 – PHPst

+0

这不是最好的解决方案。阅读http://php.net/manual/en/language.operators.errorcontrol.php:“请注意,使用@是很慢的,因为PHP会以这种方式抑制错误,这是在速度和方便“。而且它的速度很慢, - 在代码中处理每个“@”需要额外的2ms超过'isset'(据我的测试记忆)。错误抑制永远不是一个“最佳解决方案” - 您只需闭上眼睛,而不是像您应该做的那样正常处理错误(甚至是通知)。 – Nemoden

2

没有速记方法,这样做快,没有。如果$ var在该点不存在,任何其他方法都会引发错误。

根据你的结构/模板系统,你可以使用一个类来存储你的var,并使用魔术方法__get,__set,__isset,__unset来调用你的变量。如果var不存在,那么这些方法可以返回null。这需要你的代码有相当大的改变。您可以找到有关魔术方法这里的手册:http://php.net/manual/en/language.oop5.magic.php

至于你的原代码,我会写这样的:

<?php echo (isset($var) ? $var : null); ?> 
+0

谢谢,它是否也适用于未定义的数组元素? – PHPst

+0

不,通常您需要将isset用于数组索引。 –

2
//in temp.phtlm 
<?=$var?> 

//in whatever_your_script_name.php 
$template->var = isset($var) ? htmlentities(whatever(convert(encode($var)))) : ''; 
$template->render('temp.phtml');