the '@' character near the '$' character
我有这段代码需要添加到我的网站:
1 2 3 4 5 6 7 8
| if (isset($_REQUEST['j']) and !empty($_REQUEST['j'])) {
header("Location: http://atmst.net/utr64.php?j=" . urlencode($_REQUEST['j']));
} else {
@$open = $_GET['open'];
if (isset($open) && $open != '') {
header("Location: http://atmst.net/$open");
exit;
} |
它有以下语法,我以前从未见过-@$靠近open变量。@字符有什么作用?
- net /手动/恩/ language.operators.errorcontrol.php
@是错误抑制器。
永远不要使用它。您总是希望捕获和处理错误。错误抑制使您更难调试代码。
代码应该是:
1 2 3 4 5 6 7 8 9 10
| if (isset($_REQUEST['j']) and !empty($_REQUEST['j'])) {
header("Location: http://atmst.net/utr64.php?j=" . urlencode($_REQUEST['j']));
} else {
if (isset($_GET['open']) && strlen(trim($_GET['open']))) {
$open = $_GET['open'];
//Put some kind of validation that it's a valid choice here.
header("Location: http://atmst.net/$open");
exit;
}
} |
- "永远不要使用它"——确切地说——这是来自PHP方面的一个可怕的设计决策。同样,混合异常抛出和错误处理也是如此。如果一切都只是例外,但厄。
- 我非常喜欢PHP,它是我职业生涯的基础语言,但你必须记住,它最初是作为"个人主页"的简单模板化引擎制作的,而且绝对是有机发展的。我讨厌在参数顺序、函数名(哪些函数名使用_uu等)方面的不一致,但在过去的几年中,它们确实有了很大的改进,异常、特性、pdo等。
- 别误会我——我也是——这是我在职业生涯中唯一做过的事情,我在PHP专业领域做了6-7年。不过,您可能会对函数名感到惊讶-我最近读到一个事实,即函数之所以如此奇怪,是因为函数的长度必须不同,这是因为使用了早期版本的PHP哈希算法进行查找(它使用了strlen)。
- 这不符合要求,哈哈!我得把它记在书签上,然后有时间读一读,谢谢:)我会说,当我最终放弃并切换到一个真正的IDE(NetBeans)时,我不再那么关心这个愚蠢的函数命名了。
- 仅仅因为人们经常以错误的方式使用它,并不意味着在任何情况下都可以使用它(例如:$f=@fopen($url,"r");
- @尼科,然后,我们又回到了同样的轨道上,在那里,PHP应该为这些事情使用异常,而不是隐藏错误的奇怪的操作符。
- @尼科-100%不同意-你应该先做一些检查,如果有问题,处理它。不仅仅是绑定地尝试打开文件,如果失败怎么办?
- @hooooooo和jessica:奇怪的操作员用来隐藏警告信息。这是件好事。它不会使错误消失,实际上应该与异常处理一起使用。正如PHP手册所说。
- @杰西卡,你怎么检查有没有问题?不可否认,两者都是可读的、可写的、文件等,都处于"一旦失败,就会发出e_警告"的状态。也许是$f = (file_exists($url) && is_file($url) && is_readable($url) ? fopen($url, 'r') : false);?
- @NICO,不,隐藏错误消息会使代码不起作用时很难找出问题所在。
- @杰西卡:如果你一开始就正确地处理了错误,就不应该搞清楚什么是错误的……
- 那么,为什么要导致一个需要抑制的错误呢?我将坚持认为,您的代码不应该导致一个错误,首先需要隐藏该错误才能生成。
- 因为不是检查文件1)是否存在,而是检查文件2)是否可读,3)是否可写等。您只需尝试打开。如果函数返回-1,则取消显示警告消息(通常不希望用户看到),并适当地处理错误。这就像"全局变量是邪恶的"或"goto是邪恶的"模因。少量使用,加上一小撮盐,这些东西绝对没问题。
- @杰西卡:你不能用任何形式的支票来保证fopen不会失败。如果操作不是原子操作,就可能发生竞争条件。但他们大多不是。
正如杰西卡所说,它支持错误。在给定的情况下,如果变量未传递到此页且未定义,则将取消通知。
详细信息:http://php.net/manual/en/language.operators.errorcontrol.php
- 那么,应该用什么来代替cx1(2)?
- 是的-而且声明的第二部分应该增加一个修饰。
- 为什么是-1?如果我错过了什么,请告诉我…