Ошибка сервера Php, вызванная возвратом ?:http

Я новичок в php, и я застрял в проблеме, я надеялся, что кто-то может предложить мне помощь.

Когда я загружаю .php со следующим содержимым на свой сервер и загружаю его в браузере Chrome, проблем не возникает.

<?php

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

}

Однако, когда я загружаю файл .php, содержащий очень похожий код ниже (разница заключается в наличии ?:"http"), хром возвращает ошибку сервера (вставленную ниже кода)

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

Ошибка:

Ошибка сервера Веб-сайт обнаружил ошибку при получении «URL». Он может быть недоступен для обслуживания или неправильно настроен.


person Ben Pearce    schedule 09.01.2012    source источник
comment
Это недопустимый синтаксис. Как вы думаете, что он делает?   -  person SLaks    schedule 09.01.2012
comment
Что именно ты пытаешься сделать? Я имею в виду, какой результат вы ищете?   -  person Adi    schedule 09.01.2012
comment
Это ошибка синтаксического анализа для PHP 5.2 и более ранних версий. Ярлык ?: работает только с версии 5.3 и выше.   -  person mario    schedule 09.01.2012
comment
Спасибо, Марио, приятно это знать. Оказывается, я использую PHP 5.2   -  person Ben Pearce    schedule 09.01.2012


Ответы (2)


Вы должны изменить его на

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

Таким образом, это будет означать, что если есть ($_SERVER['HTTP_X_FORWARDED_PROTO'], используйте его, иначе используйте http.

person Virendra    schedule 09.01.2012
comment
Это не вызывает ошибку. Как только я убедюсь, что эта функция все еще выполняет свою намеченную задачу, я отмечу это как правильное. Большое спасибо за помощь. - person Ben Pearce; 09.01.2012

Я полагаю, вы пытаетесь использовать то, что называется тройкой оператор. Этот оператор ожидает следующий синтаксис:

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

В документации указано, что вы можете опустить промежуточное предложение (предложение «что делать, если истинно»), только если вы используете PHP 5.3 или более позднюю версию. На мой взгляд, это плохая практика. Я не знаю каких-либо других языков программирования, которые допускают этот ярлык, и это только усложняет чтение вашего кода (особенно если вы читаете его через год или больше после того, как написали). Лучше всего писать код, который (где это возможно) обратно совместим; в результате он будет намного более портативным.

Обновление: я немного читал о тернарном операторе в Википедии. , и в нескольких других языках есть такие ярлыки (например, существует расширение GNU для C). Я все еще думаю, что использование ярлыка — это плохо; На ум приходит случай, когда оценка оператора приводит к побочным эффектам.

person Jonah Bishop    schedule 09.01.2012
comment
I'm not aware of any other programming languages that allow that shortcut - на самом деле это делает Javascript, но синтаксис отличается, поскольку он использует оператор || ИЛИ, поэтому я полагаю, что это не совсем то же самое. Например. var someVar = someOtherVar || 6; дает someVar значение someOtherVar, если оно истинно, и 6, если нет. - person DaveRandom; 09.01.2012
comment
@DaveRandom Логическое ИЛИ - это совсем другой оператор, чем троичное сравнение. JavaScript поддерживает тернарный оператор, но оба условия являются обязательными (вы не можете использовать ярлык, упомянутый в исходном вопросе постера). - person Jonah Bishop; 09.01.2012