在什么情况下PHP的错误抑制不适用于未定义的索引?

我正在使用具有以下代码的编辑器库:</ p>

  $ data ['video_id'] = @ $ data ['video_id']?:$ player ['videoId']; 
</ code> </ pre>

此行导致 500 </ code>错误,因为未定义 $ data ['video_id'] </ code>。 如果我删除 @ </ code>符号,我会得到异常注意:未定义索引:video_id </ code>。 如果我放回 @ </ code>符号,脚本会立即死掉,nginx会返回500状态。</ p>

PHP的文档说:</ p>


警告:目前 “@”错误控制操作符前缀甚至会禁用错误报告,以解决将终止脚本执行的严重错误。 除此之外,这意味着如果你使用“@”来抑制来自某个函数的错误,并且它不可用或者输入错误,那么脚本就会死在那里而没有任何关于原因的指示。</ p> \ n </ blockquote>

这可能会发生这种情况,但错误并不重要:它是一个“通知”,根据该文档,它是 @ </的有效用途 代码>。</ p>

我总是可以自己分叉这个库并修复错误,但我想知道为什么抑制变量没有按预期工作。</ p>
</ DIV>

展开原文

原文

I'm using a library via composer that has code like this:

$data['video_id'] = @$data['video_id'] ?: $player['videoId'];

This line is causing a 500 error because $data['video_id'] is not defined. If I remove the @ symbol, I get the exception Notice: Undefined index: video_id. If I put back the @ symbol, the script simply dies immediately, and nginx returns a 500 status.

PHP's documentation says:

Warning: Currently the "@" error-control operator prefix will even disable error reporting for critical errors that will terminate script execution. Among other things, this means that if you use "@" to suppress errors from a certain function and either it isn't available or has been mistyped, the script will die right there with no indication as to why.

It's possible this is happening here, but the error is not critical: it is a "notice", and according to that documentation, is a valid use for @.

I can always fork this library and fix the error myself, but I'd like to know why the suppression variable isn't working as intended.

duan0065626385
duan0065626385 在深入了解错误处理程序之后,我发现了一个问题:有一个自定义的monolog处理器没有正确处理错误。随意发布这个作为答案!
11 个月之前 回复
duanqing3026
duanqing3026 与??不同@运算符不会禁止记录未定义的变量。如果Symfony处理程序因将其发送到日志而绊倒,那么这就是500发起的地方。
11 个月之前 回复
duanshan7261
duanshan7261 抑制器工作不正常。
11 个月之前 回复
dongyi1777
dongyi1777 正在使用默认的symfony错误处理程序,我不相信它会抑制任何错误。它记录所有错误。
11 个月之前 回复
doutongya8378
doutongya8378 上面是非常有用的,但可能有问题取决于该字段的值,因为它使用isset。我只想用array_key_exists包装$data['video_id']。
11 个月之前 回复
doujiao3016
doujiao3016 你有一个用户定义的错误处理程序,可能会出错吗?
11 个月之前 回复
drjltlm156790
drjltlm156790 我认为真正值得注意的是这是错误的做法。你应该在这里使用Nullcolascing运算符(??)。$data['video_id']=$data['video_id']??$播放器['VideoID的'];.在PHP7.4中,它将能够缩短为$data['video_id']??=$player['videoId'];.
11 个月之前 回复
Csdn user default icon
上传中...
上传图片
插入图片
抄袭、复制答案,以达到刷声望分或其他目的的行为,在CSDN问答是严格禁止的,一经发现立刻封号。是时候展现真正的技术了!
立即提问