【问题标题】:PHP / MySQL, not understanding foreach loop in this particular case. [conceptual Q]PHP / MySQL,在这种特殊情况下不理解 foreach 循环。 [概念Q]
【发布时间】:2018-05-31 02:13:05
【问题描述】:

在我提出问题之前,我将发布代码:(请注意,如果你能解释第二个问题就足够了,我真的很困惑 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. 首先,这些类中的“this”是什么?它只是用户对象的占位符,也就是当前对象,对吧?我认为是这样。

  2. 其次,我的主要问题是,当我们调用成员函数 showAllUsers() 时,我们转到 ViewUser 类,然后我们有一个 $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) 遍历每个元素,但是要显示它我们需要回显 data[0]?
我的理解正确吗?我知道它是一个关联数组,所以那些 0、1、2... 等是表的列标题..

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

【问题讨论】:

  • 上面的代码是OOP,即面向对象编程。它不同于程序。在过程中,您可以以线性方式构建代码,而 OO 您可以基于对象构建代码。我在用手机,所以我现在无法输入其余的内容 - 但是一旦我到达我的电脑,我会回答,除非那时其他人有。同样在类中,您调用的变量称为属性,而您习惯调用函数的称为类内部的方法。
  • 我看到其他人已经回答了。我会告诉你这一点——当你潜入 OOP 时,忘记 MySQLi 并学习使用 PDO。
  • 在问这个问题之前,你必须学习更多的OOP(面向对象编程)。我认为stackoverflow“不是学习OPP的地方”,而是提出与基本OOP学习过程无关的具体问题。
  • 我不得不问,网上任何地方都没有足够好的解释,我想这是专家认为我会弄清楚的问题,但我只需要一些确认,这样我才能继续。跨度>
  • 我会说试试 PHP 聊天室,但如果你也在那里提问,我们会说阅读和学习,但至少你不会冒着被限制提问一段时间的风险,如果你在聊天中问。只需在聊天中具体提出您的问题,不要那么广泛。

标签: php mysql object-oriented-analysis


【解决方案1】:

这对于一个类处理方案来说实际上是相当糟糕的,但你的问题仍然有效。

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

【讨论】:

    猜你喜欢
    • 2012-01-31
    • 2016-05-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-26
    • 2015-05-06
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多