PHP error_log 仍然可以在带有 break 的 switch 内部工作

PHP error_log still work inside switch with break

我以为我的代码中有错误,但通过隔离问题,我发现了 switch case 中 error_log() 的一些 'weird' 行为。

我添加了一些 error_log 用于调试,但是每当我 运行 切换开关时,即使调用是在有效案例。

这里是我的代码中让我发现这个奇怪之处的确切部分:

switch($LLTP->request()){

  case 'json':
    /* some code commented out for debug here */
    error_log('json');
    echo 'json';
    break;

  default:
    /* some code commented out for debug here */
    error_log('html');
    echo 'html';
    break;
}

请求方法简单明了,return像'json','html','ajax'等字符串。

 public function request(){
    return $this->requests;
  }

所以如果开关是 html,默认启动,我得到预期的结果:

echoing 'html' (expected)

errorlog 'html' (expected)

但是当我 运行 使用 'json' 开关时,我在屏幕上和 error_log 内部得到了预期的 'json',但我也得到了 'html' 错误条目(没有回显)。

echoing 'json' (expected)

errorlog 'json' (expected)

errorlog 'html, referer: https://www.example.com/home.json' (unexpected)

这是正常行为吗?我第一次注意到它,如果我尝试用另一个示例代码重现 'weirdness':

$vv='json';
switch($vv){
  case 'json':
    echo 'json';
    error_log('json');
    break;
  default:
    echo 'html';
    error_log('html');
    break;
}

我明白了,(在错误日志中)

[error] json (expected)

[error] json, referer: http://www.example.com/home.json (unexpeted as it's the second entry in the log)

我迷路了,有些地方我不明白或预期的结果不是我预期的。

PS: 我不在页面上输出错误,我只在日志中记录错误。如果这与它有任何关系o.O

今天我找到了原因。

当我测试时,我用我的浏览器欺骗了一个 json 请求。但每次我点击刷新时,我的浏览器也会发送对 favicon.ico 文件的请求。由于我没有为图像添加 mod_rewrite 规则,它被代码作为常规 html 请求处理,因此调用了开关的 html 部分。