Что не так делаю при создании объектов? Разбираюсь с таким важным понятием как ООП и применение его в php. Теорию уже прочел вроде понял. Но как дело дошло до практики которую сам придумал чет застрял. Итак суть задачи и мое решение.
Есть некий xml который хранит в себе жилые комплексы, они в себе дома, далее квартиры (но пока остановлюсь на первом).
Структура следующая

1
ЖК 1


2
ЖК 2

Полей намного больше, но мне они не нужны. Хотел собрать свой объект в котором буду эти поля со своими названиями свойств объекта.
Создаю класс "Комплексы" и "Комплекс".class Complexes {
private $complexes = array();
public function addComplex($id, $complex) {
$this->complexes[$id] = $complex;
}
public function showComplexes() {
print_r($this);
}
}
class Subject {
protected $id;
protected $name;
function __construct($subject) {
$this->id = $subject->id;
$this->name = $subject->name;
}
public function var_d() {
print_f($this);
}
}
Создаю объект "Комплексы"$complexes = new Complexes();
Далее в цикле пробегаю комплексы, создаю объекты (как то их дополнительно обрабатываю) и добавляю в "Комплексы"foreach($xml as $c => $complex) {
$complexObj = new Subject($complex);
// что-то свое здесь делаю
$complexes->addComplex($complex->id, $complexObj);
}
В конце пробую вывести вот так $complexes->showComplexes();
И массив пустой
Но если в цикле поставить вывод $complexObj->var_d(); то все норм, но структура немного странная (по крайней мере для меня)Subject Object
(
[id:protected] => SimpleXMLElement Object
(
[0] => 1
)
[name:protected] => SimpleXMLElement Object
(
[0] => ЖК 1
)
)
Subject Object
(
[id:protected] => SimpleXMLElement Object
(
[0] => 2
)
[name:protected] => SimpleXMLElement Object
(
[0] => ЖК 2
)
)

21 Авг 2019 в 06:59
236 +1
0
Ответы
1

Проблема здесь в том, что вы не обращаетесь к полям объекта SimpleXMLElement правильно.

Когда вы создаете объект Subject в цикле, вы передаете в конструктор объект SimpleXMLElement ($complex), а затем пытаетесь обратиться к его свойствам так: $complex->id и $complex->name. Однако, у объекта SimpleXMLElement свойства доступны через массив, а не непосредственно через объект.

Вместо $complex->id и $complex->name попробуйте использовать $complex->id[0] и $complex->name[0]:

class Subject {
protected $id;
protected $name;
function __construct($subject) {
$this->id = $subject->id[0];
$this->name = $subject->name[0];
}
public function var_d() {
print_r($this);
}
}

После этого ваш код должен корректно добавлять объекты в массив и выводить их при вызове метода showComplexes().

20 Апр в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 94 757 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир