Почему пустой($object->arrayProperty) возвращает true, когда элементы массива установлены и заполнены? [дубликат]Php

Кемеровские программисты php общаются здесь
Ответить Пред. темаСлед. тема
Anonymous
 Почему пустой($object->arrayProperty) возвращает true, когда элементы массива установлены и заполнены? [дубликат]

Сообщение Anonymous »

Без каких-либо других изменений следующие три строки в одном и том же месте дают (для меня) непонятные результаты. Первый результат в моей голове не соответствует тому, что возвращают другие строки:

Код: Выделить всё

var_dump(empty($this->table)); //results in "bool(true)"

Код: Выделить всё

var_dump($this->table); //results in an array of 75 elements

Код: Выделить всё

var_dump(empty($this->table[0])); //results in "bool(false)"
Прежде всего:
  • Мой вопрос НЕ в том, что делать, чтобы мой код работал. Во многих других темах это очень хорошо объясняется, и я не хочу здесь дублирования.
  • Мой вопрос НЕ в том, почему PHP имеет здесь ошибку. Поскольку PHP - это то, что он есть, и это его поведение.
  • Поскольку !isset() для неложных элементов является эквивалентом на пустой(), в этом случае он, очевидно, дает те же результаты. Я мог бы поменять местами «...пустой($array) результат true...» внутри заголовка на «...почему массив не существует...». Я решил использовать более конкретную формулировку.
Я ищу объяснение, которое приводит к этому (по крайней мере для меня) путанице результат. Я предполагаю, что это может быть механизм, связанный с __get() или ob_get_clean(), но я понятия не имею, как они работают внутри.
Окружающая среда:
  • У меня есть метод внутри объекта, который извлекает массив из CSV-файла. (имена изменены)

    Код: Выделить всё

    $object = new Class();
    
    empty($object->method()); //results in false - as I would expect as an array with 75 elements is returned
    
  • Я заключаю это вместе с другими переменными разных типов в массив параметров.

    Код: Выделить всё

    $params =['table' => $object->method(),...];
    
    empty($params['table']); //still results in false here
    
  • Через объект View я передаю массив параметров в представление

    Код: Выделить всё

    return (new View('transactions/show',$params))->render();
    
    Для передачи внутри объекта View я использую магический метод __get

    Код: Выделить всё

    public function __get(string $name) {
    return $this->params[$name] ?? null;
    }
    
    Функция рендеринга включает представление с буферизацией вывода

    Код: Выделить всё

        public function render() {
    ob_start();
    include VIEW_PATH . DIRECTORY_SEPARATOR . $this->view . '.php';
    return ob_get_clean();
    }
    
  • Внутри представления («транзакции/шоу») я могу получить доступ к параметрам с помощью переменной $this->и, как упоминалось выше, массив доступен и работает нормально, но результат "истина" для пустой таблицы ($this->table) меня смущает.
Все мои тесты привели меня к выводу, что шаг 3. отвечает за результаты, которые я получаю на шаге 4.
Чтобы показать воспроизводимую версию, заполните файлы:Класс контроллера:

Код: Выделить всё


Подробнее здесь: [url]https://stackoverflow.com/questions/79108867/why-does-emptyobject-arrayproperty-result-in-true-while-array-elements-are-s[/url]
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Php»