Что это делает «или» в левой части оператора присваивания PHP?

Я работаю над некоторыми вещами OAuth и нашел эту интересную строку кода:

$port or $port = ($scheme == 'https') ? '443' : '80';

Я не знаком с ключевым словом или, находящимся слева от оператора присваивания.

Я бы ожидал
$ a или = ($ b = $ c);
будет приравнять к
$ a = $ a или ($ b = $ c);
аналогично
$ str. = «Добавить это к str»;
приравнивается к
$ str = $ str. «Добавить это к str»;

Поиск «или» в справке дает много-много результатов! Поэтому я обратился к stackoverflow ….

Может кто-нибудь сообщить мне, что делает ключевое слово «или» в левой части задания.

В контексте вся функция:

public static function php_self($dropqs = true) {
$url = sprintf ( '%s://%s%s', empty ( $_SERVER ['HTTPS'] ) ? (@$_SERVER ['SERVER_PORT'] == '443' ? 'https' : 'http') : 'http', $_SERVER ['SERVER_NAME'], $_SERVER ['REQUEST_URI'] );

$parts = parse_url ( $url );

$port = $_SERVER ['SERVER_PORT'];
$scheme = $parts ['scheme'];
$host = $parts ['host'];
$path = @$parts ['path'];
$qs = @$parts ['query'];

$port or $port = ($scheme == 'https') ? '443' : '80';

if (($scheme == 'https' && $port != '443') || ($scheme == 'http' && $port != '80')) {
$host = "$host:$port";
}
$url = "$scheme://$host$path";
if (! $dropqs)
return "{$url}?{$qs}";
else
return $url;
}

2

Решение

Это эквивалентно следующему:

if (!$port) {
$port = ($scheme == 'https') ? '443' : '80';
}

Он использует короткое замыкание or оператор для определения $port если он еще не определен; если первое выражение в A or B оценивает true, тогда второе выражение не нужно оценивать.

3

Другие решения

По сути, это будет означать то же, что и:

if ($port==0) {
$port = ($scheme == 'https') ? '443' : '80';
}

Пара выражений сама по себе с логическим значением или оценивает левое значение и, если оно истинно, остановится на этом. Если левое значение равно false, оно будет затем оценивать правое значение. Так,

$a or $b

будет оцениваться как $ a, когда $ a является логическим значением true, и будет оцениваться как $ b, когда $ a является логическим значением false.

Хотя это работает, это идет вразрез с обычной практикой кодирования. Это может быть написано более четко, как я показал, например.

0

По вопросам рекламы [email protected]