3

在某些情况下,我可以使用@字符而不使用更长的isset()函数吗?如果不是,为什么不呢?

我喜欢使用它,因为在很多情况下我可以保存几个引号、括号和点。

4

7 回答 7

6

我假设您在说字符时正在谈论错误抑制运算@符,但这不能替代isset().

isset()用于确定程序中是否已经存在给定变量,以确定使用该变量是否安全。

我怀疑您正在做的是尝试使用该变量,而不管它是否存在,但要抑制可能由此产生的任何错误。@在行首使用操作符告诉 PHP 忽略任何错误而不报告它。

运算符是“为此表达式@临时设置”的简写。是一个完全不同的构造。error_reporting(0)isset()

于 2011-07-28T22:39:51.603 回答
1

你不应该只使用@. @抑制警告。这并不意味着代码是正确的,并且根据您的设置,警告可能仍会添加到您的日志文件中。isset用它来做检查要好得多。

于 2011-07-28T22:35:42.913 回答
0

据我所知@,是不可替代的isset()。它是一个错误抑制运算符,可防止在脚本中确实存在错误时显示错误。如果在 PHP 代码中使用,这也是一个非常糟糕的习惯。

于 2011-07-28T22:34:53.150 回答
0

它在技术上是有效的,但是有几个原因我isset在创建输出时更喜欢显式解决方案,我认为这就是你正在做的事情:

  1. 如果我是处理旧代码的新开发人员,我会认出这个isset成语。我知道你想做什么。有了@,要弄清楚你的意图并不容易。
  2. 假设您要检查对象的属性是否已设置,例如$user->name. 如果您只是使用错误抑制来查看是否name已设置,则您将永远不会收到$user未定义的通知。相反,最好运行isset($user->name)并明确,这样,如果$user未定义,您将收到错误通知。
  3. 总体而言,错误抑制是一个坏习惯。错误通知很好,您应该尽可能容易地收到错误通知。在不必要的时候压制它们会导致将来出现问题。
于 2011-07-28T22:38:49.823 回答
0

这取决于你想要做什么。例如,如果您正在执行 var_dump() 或其他调试,并且知道有时您的值不会被设置,我会说在这种情况下没关系。

var_dump(@$_REQUEST['sometimesIamSet']);

如果您在这种情况下使用它:

if(@$_REQUEST['something']){
    // do something
}
else{
    // do something else
}

我强烈建议不要这样做。你应该写你的代码来明确地做你想做的事。

if(isset($_REQUEST['something'])){
    // Hurray I know exactly what is going on!
}
else{
    // Not set!
}

我可以考虑使用 @ 的唯一生产实例是当您想抛出自己的错误时。例如

$database_connection = @db_connect_function();

if($database_connection === false){
    throw new Exception("DB connection could not be made");
}



另外,看看 PaulPRO 的回答。如果他所说的确实属实,那么您的日志文件也可能记录了您不知道的警告。这将导致您的日志文件在发布后的调试期间不太有用。

于 2011-07-28T22:39:16.860 回答
0

如果没有其他原因,请不要使用 @ 作为 isset 的替代品,因为:

看看这段代码:

echo (@$test) ?: 'default';

如果 $test 是'something'那么你会得到'something'.

如果 $test 是空的,null或者不存在,那么你会得到'default';

现在问题来了:

假设'0'或者FALSE是有效的答案?

如果 $test is '0'or FALSEthen you'll get 'default'NOT '0'as you would want。

您应该使用长格式三进制:

echo (isset($test)) ? $test : 'default';

在处理可以评估为布尔值错误的参数时,没有更多的编码,并且更可靠。

于 2013-11-15T16:38:11.237 回答
-1

运算符@还会使您的代码运行速度变慢,如此处所指出的:http: //php.net/manual/en/language.operators.errorcontrol.php

但正如已经指出的那样,如果发生错误,代码只会运行得相当慢。在这种情况下,使用 isset 而不是@运算符的代码要快得多,如下所述:http: //seanmonstar.com/post/909029460/php-error-suppression-performance

于 2011-07-28T22:43:17.067 回答