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






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