Что не так делаю при создании объектов? Разбираюсь с таким важным понятием как ООП и применение его в 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 ) )
Проблема здесь в том, что вы не обращаетесь к полям объекта 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().
Проблема здесь в том, что вы не обращаетесь к полям объекта 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().