这个'或'在PHP赋值语句的左侧做了什么?

时间:2014-11-17 22:52:51

标签: php variable-assignment

我正在研究一些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 个答案:

答案 0 :(得分:3)

这相当于以下内容:

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

它使用or运算符的短路来定义$port(如果尚未定义);如果A or B中的第一个表达式求值为true,则不需要计算第二个表达式。

答案 1 :(得分:0)

基本上就是这样说:

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

一对表达式本身与布尔值或将评估左值,如果为真,将停在那里。如果左侧值为false,则它将继续评估右侧值。所以,

$a or $b
当$ a是布尔值时,

将评估为$ a;当$ a为布尔值false时,

将评估为$ b。

虽然它有效,但它违背了常见的编码习惯。例如,正如我所示,它可以写得更清楚。