Как мне объявить «подобъекты» в PHP

#php #oop

#php #ооп

Вопрос:

Я относительно новичок в ООП в PHP, и я не уверен, возможно ли или рекомендуется то, что я пытаюсь сделать. В любом случае, я не могу этого понять. Я был бы признателен за любые указания на учебные пособия или документы, которые могли бы помочь — я не ожидаю здесь полноценного ответа.

У меня есть система, в которой у каждого пользователя есть несколько «Библиотек». Каждая библиотека содержит несколько «элементов».

Настройка БД выглядит следующим образом:

 user_libraries
 - id (unique)
 - user_id (identifies user)
 - name (just a string)

elements
 - id (unique)
 - content (a string)

library_elements
 - id (unique)
 - library_id
 - element_id
  

откуда library_id берется идентификатор user_libraries и откуда element_id он elements .

Я хочу иметь доступ к библиотеке данного пользователя и их элементам.

Я настроил класс library и могу использовать его для получения списка библиотек (или вложенного списка).

Я делаю это следующим образом:

 $mylibraryset = new LibrarySet();
$mylibraryset->getMyLibraries();
  

что дает (когда я использую print_r):

 LibrarySetObject (
 [user_id] => 105
 [data_array] => Array (
  [0] => Array (
   [id] => 1
   [user_id] => 105
   [type] => 1
   [name] => My Text Library
  )
  [1] => Array (
   [id] => 2
   [user_id] => 105
   [type] => 2
   [name] => Quotes
  )
 )
)
  

Теперь, что я хотел бы иметь возможность сделать, это для каждой из этих библиотек (элементы в data_array), чтобы получить все элементы.

Лучшая идея, которая у меня была до сих пор, — это сделать что-то вроде:

 foreach($mylibrary->data_array as $library) {
 $sublibrary = new Library();
 $sublibrary -> getAllElements();
}
  

где Sublibrary — это другой класс, который имеет функцию getAllElements . Я не могу заставить это работать, и я не уверен, что я на правильном пути…

Есть ли способ, которым я могу в конечном итоге сделать что-то подобное:

 $mylibrary->sublibraries[0]->element[0]
  

для извлечения определенного элемента?

Как я уже сказал, я не ожидаю здесь полномасштабного объяснения — просто указатели, которые помогут мне начать.

Ответ №1:

 <?php

class Library {
    public $element;
    public $data;
    public function __construct($sublibrary) {
        $this->data = $sublibrary;
    }
    public function getAllElements() {
        // populate $this->element using $this->data
    }
}

class LibrarySet {
    public $user_id;
    public $data_array;
    public $sublibraries;
    public function getMyLibraries() {
        // populate $this->data_array

        $this->sublibraries = Array();
        foreach($this->data_array as $index => $sublibrary) {
            $this->sublibraries[$index] = new Library($sublibrary);
            $this->sublibraries[$index]->getAllElements();
        }
    }
}

$mylibraryset = new LibrarySet();
$mylibraryset->getMyLibraries();

$mylibraryset->sublibraries[0]->element[0]

?>
  

Комментарии:

1. Вау, спасибо! Я не ожидал полного ответа, но вы действительно помогли. И это также помогает мне разобраться в этом. Еще раз спасибо.