Poprawnie w Twoim wypadku byłoby tu użyć "zawierania się" jednej klasy w drugiej (zobacz jak to prezentuje się w UML). A co do Twojego problemu, jak na moje doświadczenie powinieneś to zrobić następująco... Podam to na przykładzie kodu, który przychodzi mi teraz na myśl... Rzecz jasna będzie to tylko przykład i nie gwarantuję, że będzie wolny od błędów.
<?php
interface iNewsUploader {
public function upload(News $oNews);
public function download(News $oNews, $iIdNews);
}
class Uploader {
/* jakis tam zestaw metod */
}
class NewsUploader implements iNewsUploader {
protected $oUploader;
public function __construct(Uploader $oUploader) {
/* wiadome operacje */
}
public function upload(News $oNews) {
/* wiadome operacje - pobranie tresci newsa oraz obrazkow lub sciezek obrazkow - zalezy co tam sobie wybierzesz */
}
public function download(News $oNews, $iIdNews) {
/* wiadome operacje - pobranie newsa skads tam na podstawie jego id */
}
}
class News {
protected $iIdNews;
protected $oUploader;
protected $sContent;
protected $aImages;
public function __construct($iIdNews = null) {
/* wiadome operacje */
}
public function setUploader(iNewsUploader $oUploader) {
/* wiadoma operacja */
}
public function addImage($sImgPath) {
/* dodanie do tablicy obrazkow */
}
public function setContent($sContent) {
/* ustawienie tresci newsa */
}
public function getContent() {
/* z tej metody moglaby korzystac klasa newsuploader do pobrania zawartosci opisu
newsa */
}
public function getImage() {
/* z tej metody moglaby kozrystac klasa news uploader do pobrania jednego obrazka
(lub sciezki do obrazka), kazde nastepne wywolanie zwracaloby
* kolejny obrazek z tablicy az do momentu zwrocenia wartosci false */
}
public function save() {
/* wywolanie metody upload klasy NewsUploader do zapisu zawartosci */
$this->oUploader->upload($this);
}
public function load() {
/* wiadome operacje */
$this->oUploader->download($this, $this->iIdNews);
}
}
$oUploader = new Uploader();
$oNewsUploader = new NewsUploader($oUploader);
$oNews = new News();
$oNews->setUploader($oNewsUploader);
$oNews->setContent('Tralala');
$oNews->addImage('sciezunia/obrazek.jpg');
?>
Juz tlumacze.
- Istnieje interfejs, ktory dostarcza dla klasy News wiadomy zestaw metod do pobrania lub zapisania danego newsa.
- Klasa NewsUploader jest pewnego rodzaju posrednikiem dla klasy News.
- Klasa Uploader, umozliwia ogolnie zapisywanie i pewnie odczytywanie informacji w jakims tam miejscu (w bazie, na dysku, itp.).
- Klasa News reprezentuje jeden news.
- Dzieki takiemu rozwiazaniu mozesz w kazdej chwili dostarczyc klasie News inna implementacje klasy implementujacej interfejs iNewsUploader, ktora zapisuje dane w innym miejscu niz klasa NewsUploader. (Powiedzmy ze teraz masz zapis w bazie, a kiedys przyjdzie potrzeba zapisu na dysku)
Tutaj zalozenie jest takie, ze Uploader zapisuje roznego rodzaju informacje, jak obrazki i tekst. Jesli Uploader ma byc tylko do zapisywania obrazkow, to do konstruktora klasy NewsUploader musisz dorzucic jeszcze jedna zmienna, ktora trzyma obiekt klasy odpowiedzialnej za zapis danych tekstowych, np obiekt do bazy danych PDO.
W powyzszym przykladzie podano operacje jakie nalezaloby wykonac, aby dodac nowy news. Jesli chcemy zczytac jakiegos newsa, do konstruktora musimy dostarczyc id newsa, na podstawie ktorego dany news zostanie pobrany.
Pozdrawiam