PHP / MySQL,不理解这种特殊情况下的 foreach 循环。 [概念问]

PHP / MySQL, not understanding foreach loop in this particular case. [conceptual Q]

在我问我的问题之前,我会 post 代码:(请注意,如果你能解释第二个问题就足够了,我真的很困惑 foreach 循环中发生了什么。

<?php
class dbh {
    private $servername; private $username; private $password; private $ 
    dbname;
    protected function connect() {
    $this->servername = "localhost";
    $this->username = "root";
    $this->password = "";
    $this->dbname = "whatever";

    $conn = new mysqli($this->servername, $this->username, $this->password, 
$this->dbname);
    return $conn;
    }
}

<?php
class User extends Dbh {
    protected function getAllUsers() {
        $sql = "SELECT * FROM user";
        $result = $this->connect()->query($sql);
        $numRows = $result->num_rows;
        if($numRows > 0) {
           while($row = $result ->fetch_assoc()) {
               $data[] = $row;
           }
           return $data;
        }
    }
}

<?php
class ViewUser extends User {
   public function showAllUsers() {
      $datas = $this->getAllUsers();
      foreach ($datas as $data) {
         echo $data['uid'] . "<br>";
         echo $data['pwd'] . "<br>";
      }
   }
}

<?php
    includes all those classes
?>

<body>
<?php
    $users = new ViewUser();
    $users->showAllUsers();
?>
</body>

关于这段代码,我有几点不明白。

  1. 首先,class中的"this"是什么?它只是用户 object 的占位符,也就是当前的 object,对吧?我觉得是这样的。

  2. 其次,也是我的主要问题,当我们调用成员函数 showAllUsers() 时,我们转到 ViewUser class,然后我们有一个 $datas 变量被分配给$this->getAllUsers() 最终返回一个 $data 数组,其中包含数据库中的所有行...对吗?

那么我的问题是,foreach循环中$datas的内容是什么?它是一个行数组吗? $data 应该是键值,但 $data 也是一个让我很困惑的数组。

我将其可视化为 $datas = $data,所以 $datas[] = [$data[0], $data[1], $data[2], $data[3], ... $data[last_one]] 这些元素中的每一个都包含一行...... 所以 foreach($datas as data) 遍历每个元素,但要显示它我们需要 echo data[0]?
我的理解正确吗?我知道这是一个关联数组,所以那些 0、1、2... 等是 table..

的列标题
  1. 此外,当我们有 $row = fetch_assoc 时,$fetch_assoc 究竟做了什么?我们只是将行存储在 $rows 变量中吗?当我们到达最后一行时,while 循环为假,对吗?我已经习惯在 while 循环中看到条件语句,例如 while (x == 4)。到目前为止,我从未见过我们分配变量的情况,例如 while (x = 4) 。

这对于 class 处理方案来说实际上很差,但你的问题仍然有效。

  1. 你说的有点对。 $this 是对 class 的当前实例(读取:对象)的引用,您在其中定义了使用 this 关键字的方法。
  2. 在所有情况下都是正确的。你也是对的,因为 datas 是一个数组数组(代表数据库中的行 table)。 $datas 的每个元素都包含另一个表示单行的数组,其中每个元素都是该行的一列。它们是关联数组,所以索引是一个键,就像你说的那样。
  3. 根据 the documentationmysqli::query returns 类型的对象 mysqli_result,因此您不能直接将其作为数组访问。 mysqli::fetch_assoc 将通过移动指针逐行将 mysqli_result 转换为关联数组,这就是为什么你一直在 while 循环中循环直到 fetch_assoc returns false(即,当结果对象中没有更多行时,或者当指针到达最后一行时)。