【问题标题】:evaluation of assignment in phpphp中赋值的评估
【发布时间】:2011-08-21 21:20:00
【问题描述】:

我有一个关于 php 的“基础”问题。在fgets 的示例代码中,它有这个 sn-p 作为读取文件内容的示例:

while (($buffer = fgets($handle, 4096)) !== false) {
    echo $buffer;
}

($buffer = fgets($handle, 4096))这个语句怎么能有值呢?是不是$buffer的赋值+评价?我的意思是,它如何获得它的价值?有这个名字吗?我注意到它使用严格的比较,所以所有的赋值都评估为布尔值是真还是假?

如果我想编写一个可以这样处理的函数,除了在某些条件下返回 false 之外,我是否需要做一些特别的事情?

【问题讨论】:

    标签: php variable-assignment evaluation


    【解决方案1】:

    当您在 PHP 中进行赋值时,赋值返回被赋值的值。这允许您在条件或循环或其他表达式中评估赋值。

    var_dump ($var = 'test');
    

    这会导致将“test”分配给 $var,并显示新分配的 $var 值。

    上面的代码示例在同一个操作中进行赋值和测试,这是一种很常见的程序员简写。 fgets() 从打开的文件中返回一行,如果没有要返回的行,则返回 false。你可以这样做

    while ($buffer !== false) {
        echo $buffer;
        $buffer = fgets($handle, 4096);
    }
    

    但是您当然必须在进入循环之前将缓冲区设置为非假值(通过在循环之前执行 fgets 或分配一个不会显示但不是假的值,例如空字符串)。

    或者您可以进一步简化:

    while ($buffer = fgets($handle, 4096) !== false) {
        echo $buffer;
    }
    

    【讨论】:

    • 偶然发现了这个答案并想补充:根据运算符优先级 (php.net/manual/en/…),!== 的绑定比 = 强,所以在最后一个示例中,$buffer 将变为 @ 987654328@ 如果fgets 成功而不是返回的字符串。因此,它应该是($buffer = fgets($handle, 4096)) !== false,就像在 OP 中一样。
    【解决方案2】:

    根据文档以及其他人已经说过的内容,它并不总是返回布尔值。它仅在完成或出现错误时返回布尔值。

    来自 PHP 手册:

    返回一个长度不超过 - 1 的字符串 从指向的文件中读取的字节数 处理。

    如果发生错误,返回 FALSE。

    所以,无论如何,这样的方法的工作原理并没有什么特别之处,您可以这样编写自己的方法:

    function increment($num) {
        if( $num < 10 ) { return ++$num; }
        return false;
    }
    
    $i=-1;
    while( ($i = increment($i)) !== false ) {
        echo( $i."<br />" );
    }
    

    【讨论】:

      【解决方案3】:

      在 PHP 中,赋值是一个表达式,即它返回一个值。 $buffer = fgets($handle, 4096) 会先将值赋值给$buffer,然后返回赋值的值。

      所以,基本上,你可以这样写:

      $buffer = fgets($handle, 4096);
      while ($buffer !== false) {
          echo $buffer;
      
          $buffer = fgets($handle, 4096);
      }
      

      在这里,您将在单独的行上分配作业。因为在那种情况下你需要重复赋值,所以循环条件中的赋值是首选。

      PS:while 循环中最常见的赋值示例可能是从 mysql 中获取行:

      while ($row = mysql_fetch_assoc($result)) {
          echo $row['firstname'] . ' ' . $row['lastname'];
      }
      

      【讨论】:

      • 所以在示例代码 sn-p 中,它起作用的原因是因为fgets 可以返回false,这会将false 分配为$buffer 的值,这反过来会是评估作业的结果吗?
      • @user151841:是的,这正是原因;)
      • 另请注意,您的情况下的严格比较更多地与函数结果有关,而不是与循环条件有关。在这种情况下,您可能会从 fgets 函数中得到一个结果,该函数可能被解释为 false(例如空字符串),您可能只想检查它是否返回布尔值 false。
      【解决方案4】:

      === 运算符不仅检查函数是否返回可能被视为错误的值(如 0、NULL 等),它还真正检查布尔值 false,您可以在此处阅读:http://de.php.net/manual/en/language.operators.comparison.php

      【讨论】:

        【解决方案5】:

        因为“没有更多数据”或“错误”返回 FALSE,所以while 循环将一直执行,直到它必须停止。

        更清晰的写作方式是:

        $buffer = fgets($handle, 4096);
        while( $buffer !== false )
        {
            echo $buffer;
            $buffer = fgets($handle, 4096);
        }
        

        但这远没有那么干净。

        【讨论】:

          【解决方案6】:

          它在 fgets 未返回 false 时进行评估。括号中的赋值返回已经赋值的值。所以($buffer = fgets($handle, 4096)) 正在返回fgets 值。

          如果文件指针中没有更多数据要读取,则返回 FALSE。

          简单示例:

          $a = 'a';
          $b = 'b';
          echo ($a = $b);
          

          返回

          b
          

          【讨论】:

            【解决方案7】:

            在条件上下文中(例如whileif),(x = y) 既是赋值又是表达式。它返回被分配的值。

            你不需要对你的函数做任何特殊的事情就可以让它们像这样使用 - 这是语言的一个特性。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2012-02-02
              • 1970-01-01
              • 2011-01-01
              相关资源
              最近更新 更多