Передача массивов от одной функции к другой - одна выходит пустой, другая нет? - PullRequest
1 голос
/ 08 января 2020

Я довольно новичок в OOP php, но уже несколько лет кодирую процедурно. Это совершенно другой способ кодирования (по крайней мере, для меня), поэтому я просто не могу обдумать это:

В основном мне нужно извлечь MySQL данные и отобразить их в таблице. На данный момент у меня есть класс DBQuery с двумя функциями - одна для запроса данных и сохранения их в массиве, а другая для рендеринга таблицы с использованием содержимого массива.

Если I var_dump() массив из класса запросов, я получаю содержимое из базы данных, как я должен. Но если я сделаю то же самое в функции displayTable(), она будет пустой. Тем не менее, я создал массив $testvar, который отлично подходит для обеих функций var_dump(), поэтому у меня может возникнуть ошибка в процессе обработки массива $data, из-за которого он в какой-то момент сам себя разрушит, или я не передаю это правильный путь.

Я боролся с этим уже 3 дня, и я уверен, что где-то упускаю важную деталь - просто не могу ее точно определить.

Мой класс DBQuery:

class DBQuery extends dbc {

    private $query;
    private $testvar = array('testing one','testing two','testing three');
    private $data = array();

    public function __construct($sqlQuery) {


        $testvar = $this->testvar;
        $data = $this->data;

        $this->query = $sqlQuery;

        $result = $this->connect()->query($sqlQuery) or die('Database error');
        $numRows = $result->num_rows;
        if ($numRows > 0) {
            while ($row = $result->fetch_assoc()) {
                $data[] = $row;
            }

            var_dump($data); // ***** THIS HAS CONTENT *****

        }

    }

    public function displayTable() {

        var_dump($this->testvar); // ***** THIS HAS CONTENT *****
        var_dump($this->data);    // ***** THIS IS EMPTY *****

    }
}

И мой взгляд:

<?php
    $query = new DBQuery("SELECT * FROM users");
    $query->displayTable();
?>

Что я здесь не так делаю? :)

1 Ответ

1 голос
/ 08 января 2020

Из PHP документации по массиву :

Присвоение массива всегда включает копирование значения.

Таким образом, эта строка равна сделав копию массива, не создавая «указатель» или «ссылку»:

$data = $this->data;

В вашем __construct измените каждое вхождение $data на $this->data, и оно будет работать, как вы намерены. В качестве альтернативы вы можете сделать:

$data = &$this->data;

Который создаст ссылку, но будет только больше запутывать ситуацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...