PHP / MySQL, не понимая цикла foreach в этом конкретном случае. [концептуальный вопрос]

Прежде чем я задам свой вопрос, я опубликую код: (Обратите внимание, если вы можете просто объяснить второй вопрос, этого будет достаточно, я просто очень запутался, что происходит в цикле 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. Во-первых, что такое «это» в этих классах? Это просто заполнитель для объекта пользователя, который является текущим объектом, верно? Я думаю, что это.

  2. Во-вторых, и мой главный вопрос, когда мы вызываем функцию-член showAllUsers (), мы переходим к классу ViewUser, а затем у нас есть переменная $ datas, которая присваивается $ this-> getAllUsers (), которая в конечном итоге возвращает $ data. массив, который содержит все строки в базе данных ... Верно?

Тогда мой вопрос: каково содержимое $ datas в цикле foreach? Это массив строк? $ 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. Кроме того, что именно делает $ fetch_assoc, когда у нас есть $ row = fetch_assoc? Мы просто сохраняем строки в переменной $ rows? Цикл while ложен, когда мы достигаем последней строки, верно? Я просто привык видеть условное выражение в цикле while, например, while (x == 4). Я никогда не встречал до сих пор ситуации, когда мы присваиваем переменную, например, while (x = 4).

Приведенный выше код - это ООП, объектно-ориентированное программирование. Это отличается от процедурного. В процедурном плане вы можете строить код линейным образом, в то время как объектно-ориентированный объект строит код на основе объектов. Я разговариваю по телефону, поэтому сейчас не могу напечатать остальное, но как только я доберусь до своего компьютера, я отвечу, если к тому времени кто-то еще не ответит. Также в классах то, что вы вызываете переменными, называется атрибутами, а то, что вы привыкли вызывать функции, называется методами внутри классов.

Statik Stasis 31.05.2018 04:18

Я вижу, что кто-то ответил. Я вам скажу: пока вы погружаетесь в ООП, забудьте о MySQLi и научитесь использовать PDO.

Statik Stasis 31.05.2018 04:23

Вы должны больше изучить ООП (объектно-ориентированное программирование), прежде чем задавать этот вопрос. Я думаю, что stackoverflow - это «не место, где можно узнать об OPP», а чтобы задать конкретные вопросы, не связанные с базовым процессом обучения ООП.

MarkSkayff 31.05.2018 04:34

Мне пришлось спросить, просто нигде в Интернете не было достаточно хорошего объяснения, я думаю, это вопросы, которые эксперты предполагают, что я выясню, но мне просто нужно было какое-то подтверждение, чтобы я мог продолжить.

Fortunata 31.05.2018 05:02

Я бы посоветовал попробовать чат-комнату PHP, но мы также скажем читать и изучать, если вы спросите и там, но, по крайней мере, вы не рискуете какое-то время задавать вопросы, если вы спрашиваете в чате. Просто сделайте свои вопросы в чате конкретными, а не такими широкими.

Statik Stasis 31.05.2018 05:08
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
53
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

На самом деле это довольно плохо для схемы обработки классов, но ваши вопросы все еще актуальны.

  1. Вы вроде как правы. $this - это ссылка на текущий экземпляр (чтение: объект) класса, в котором вы определяете метод, использующий ключевое слово this.
  2. Правильно во всех случаях. Вы также правы в том, что datas - это массив массивов (который представляет строки в таблице базы данных). Каждый элемент $datas содержит другой массив, представляющий одну строку, где каждый элемент является столбцом этой строки. Это ассоциативные массивы, поэтому индекс является ключевым, как вы сказали.
  3. Согласно документация, mysqli::query возвращает объект типа mysqli_result, поэтому вы не можете получить доступ к нему напрямую как к массиву. mysqli::fetch_assoc преобразует mysqli_result в ассоциативный массив, строка за строкой, перемещая указатель, поэтому вы продолжаете цикл в цикле while до тех пор, пока fetch_assoc не вернет false (то есть, когда в объекте результата больше нет строк или когда указатель доходит до последней строки).

Другие вопросы по теме