PHP:无声失败的最佳实践

sdl*_*rhc 6 php

我发现自己做了很多这样的事情:

$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

  • `@`对"表现"影响不大.这是未定义的数组偏移量,如果有的话.优化它与使用单引号一样有意义.真的,你们从哪里获得那些微观优化童话故事? (2认同)

Tim*_*tle 7

要回答标题:最好的方法是关闭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)

  • 但如果他只想抑制脚本特定部分的错误怎么办?关闭所有错误并不总是可取的. (2认同)
  • @fabio:在一个特定的部分隐藏错误被称为"bug";)如果你想到,你需要它,而不是你应该想到的那个,那个部分可能有问题. (2认同)