Я работаю над некоторыми вещами 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;
}
Это эквивалентно следующему:
if (!$port) {
$port = ($scheme == 'https') ? '443' : '80';
}
Он использует короткое замыкание or
оператор для определения $port
если он еще не определен; если первое выражение в A or B
оценивает true
, тогда второе выражение не нужно оценивать.
По сути, это будет означать то же, что и:
if ($port==0) {
$port = ($scheme == 'https') ? '443' : '80';
}
Пара выражений сама по себе с логическим значением или оценивает левое значение и, если оно истинно, остановится на этом. Если левое значение равно false, оно будет затем оценивать правое значение. Так,
$a or $b
будет оцениваться как $ a, когда $ a является логическим значением true, и будет оцениваться как $ b, когда $ a является логическим значением false.
Хотя это работает, это идет вразрез с обычной практикой кодирования. Это может быть написано более четко, как я показал, например.