Что не так делаю при создании объектов? Разбираюсь с таким важным понятием как ООП и применение его в 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
252 +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 Апр 2024 в 13:10
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир