【问题标题】:Php Server error caused by return ?:"http"返回 ?:"http" 导致的 PHP 服务器错误
【发布时间】:2012-01-09 01:14:58
【问题描述】:

我是 php 新手,遇到了一个问题,希望有人能帮我解决。

当我将具有以下内容的 .php 上传到我的服务器并在 chrome 浏览器中加载它时,似乎没有任何问题。

<?php

 class AppInfo {
   public static function getHome () {
   return ($_SERVER['HTTP_X_FORWARDED_PROTO'])."://" . $_SERVER['HTTP_HOST'] . "/";
 }  

}

但是,当我上传包含以下非常相似代码的 .php 文件时(不同之处在于存在 ?:"http"),chrome 返回服务器错误(粘贴在代码下方)

<?php
class AppInfo {
  public static function getHome () {
    return ($_SERVER['HTTP_X_FORWARDED_PROTO'] ?: "http") . "://" .    $_SERVER['HTTP_HOST'] . "/";
 }
}

错误:

服务器错误 该网站在检索“Url”时遇到错误它可能因维护而关闭或配置不正确。

【问题讨论】:

  • 那是无效的语法。你认为它有什么作用?
  • 你到底想做什么?我的意思是,您要寻找的输出是什么?
  • 这是 PHP 5.2 及更早版本的解析错误。 ?: 快捷方式仅适用于 5.3 及更高版本。
  • 感谢马里奥,很高兴知道。原来我使用的是 PHP 5.2

标签: php http server-error


【解决方案1】:

你应该把它改成

return ($_SERVER['HTTP_X_FORWARDED_PROTO'] ? $_SERVER['HTTP_X_FORWARDED_PROTO'] : "http") . "://" .    $_SERVER['HTTP_HOST'] . "/";

所以这意味着如果有($_SERVER['HTTP_X_FORWARDED_PROTO'],则使用它,否则使用http

【讨论】:

  • 这不会引发错误。一旦我确认此功能仍在执行它的预期任务,我会将其标记为正确。非常感谢您的帮助。
【解决方案2】:

我相信您正在尝试使用所谓的ternary operator。此运算符需要以下语法:

(comparison statement) ? (what to do if true) : (what to do if false)

文档指出,只有在您使用 PHP 5.3 或更高版本时,您才可以省略中间子句('what to do if true' 子句)。在我看来,这是不好的做法。我不知道任何其他允许该快捷方式的编程语言,它只会使阅读您的代码变得更加困难(特别是如果您在编写它一年或更长时间后阅读它)。最好编写(在可能的情况下)向后兼容的代码;因此,它将更加便携。

更新:我在 Wikipedia 上阅读了一些关于 ternary operator 的信息,其他一些语言确实有这样的快捷方式(例如,存在 C 的 GNU 扩展)。我仍然认为使用快捷方式不好;语句评估导致副作用的情况浮现在脑海中。

【讨论】:

  • I'm not aware of any other programming languages that allow that shortcut - 实际上是Javascript,但语法不同,因为它使用|| OR 运算符,所以我想它并不完全相同。例如。 var someVar = someOtherVar || 6;someVar 提供 someOtherVar 的值,如果其计算结果为真,则为 6,否则。
  • @DaveRandom 逻辑 OR 是一个与三元比较非常不同的运算符。 JavaScript 支持三元运算符,但两个条件子句都是必需的(您不能使用原始发帖人问题中提到的快捷方式)。
猜你喜欢
  • 1970-01-01
  • 2011-12-23
  • 1970-01-01
  • 2018-05-27
  • 1970-01-01
  • 1970-01-01
  • 2011-07-24
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多