我发现自己做了很多这样的事情:
$something = @$_GET['else'];
if ($something) {
// ...
} else {
// ...
}
Run Code Online (Sandbox Code Playgroud)
就像,几乎每当我处理数组时.我已经习惯了JavaScript和简单检查虚假价值的能力.但这在PHP中是否合适?我是否试图强迫PHP成为我已经理解的东西,而不是将其作为自己的语言学习?
编辑
我认为我可以使用isset(我也*支持它),但它对我来说很笨拙,它导致甚至笨拙的情况,我试图回应价值:
// what I want to do
echo '<input type="text" name="whatever" value="', @$values['whatever'], '" />';
// what I fear I must do
echo '<input type="text" name="whatever" value="';
if (isset($values['whatever'])) {
echo $values['whatever'];
}
echo '" />';
Run Code Online (Sandbox Code Playgroud)
撇开卫生问题,我更喜欢第一个版本.但我有一种潜在的怀疑,认为这是一个很大的禁忌.(我也有一种潜在的怀疑,我不知道如何拼写"怀疑".)
小智 11
我建议永远不要使用@运算符.它会鼓励糟糕的代码,并且当某些东西不起作用并且您正在尝试调试它时,可能会让您的生活变得悲惨.
你当然可以在php.ini中禁用通知,但如果我是你,我会开始使用isset()更多:)
你可以这样做:
echo '<input type="text" name="whatever" value="', (isset($values['whatever'])?$values['whatever']:''), '" />';
Run Code Online (Sandbox Code Playgroud)
你可以@在这里阅读更多有关可怕的内容:http://php.net/manual/en/language.operators.errorcontrol.php
嗯,这是实际的错误触发,这是昂贵的.使用@会触发错误.用isset()来检查,不是.http://seanmonstar.com/post/909029460/php-error-suppression-performance
要回答标题:最好的方法是关闭display_errors.
对于你正在做的具体,使用isset().
注意:对于抱怨这个'关闭'所有错误的人 - 来自PHP手册:
这是一项支持您的开发的功能,不应该用于生产系统(例如连接到互联网的系统).
编辑之后:您可以确保您要使用的变量具有某些值(只是盲目地回显get/post var不是最佳实践) - 或者您可以使用对象来存储您想要的变量输出(作为属性)并用于__get()在未设置属性时返回空字符串(或false).
这会让你有类似的东西:
echo $view->something;
if($view->something){
//stuff to do when something is set
}
Run Code Online (Sandbox Code Playgroud)
我相信这与许多模板/视图库的功能类似.
更新:注意到这个旧的(ish)答案,并认为可以添加一些东西.对于此用例(值可能在数组中,array_merge()也可能不在数组中),可以使用:
$default = array('user' => false);
$params = array_merge($default, $_GET);
if($params['user']){ //safe to use, will have default value if not in $_GET
}
Run Code Online (Sandbox Code Playgroud)