Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dostęp do metod z innej klasy.
Forum PHP.pl > Forum > PHP
wjkbdg
Witam,
mam klasy news (zarządzanie newsami) i file_upload.
W klasie news istnieje metoda odpowiedzialna za dodawanie nowych aktualności z możliwością dodawania zdjęć.
Przy wysyłaniu zdjęć na serwer, zamiast pisania osobnej metody w klasie news, chciałbym skorzystać z tej istniejącej w file_upload i w tym momencie mam dylemat jak to POPRAWNIE zrealizować?

Klasę news wywołuje z dwoma obiektami:
  1. <?php
  2. $news = new News($pdo, $smarty);
  3. ?>


Jedyne co przychodzi mi na myśl, to postąpić analogicznie i do w/w obiektów dorzucić obiekt klasy file_upload:
  1. <?php
  2. $news = new News($pdo, $smarty, $upload);
  3. ?>


W zasadzie, postępując w ten sposób, będę miał dostęp do metod klasy file_upload tylko nie jestem przekonany do tego czy jest to odpowiednia metoda realizacji mojego celu. Czy jest jakaś alternatywna metoda dostępu do metod innej klasy?
Moli
Dziedziczenie, interfejsy ?
wlamywacz
Po co wrzucać wszystko do kontruktora ? Nie lepiej skorzystać z seterów ?
  1. <?php
  2. $files = new files;
  3. $files->setFolder('upload');
  4. $files->setField('uploadfiles');
  5. $files->upload();
  6.  
  7. $news = new news;
  8. $news->setUploadResult($files->result());
  9. $news->setUploadMessage($files->getMessage());
  10. ?>
Shili
Cytat
Dziedziczenie, interfejsy ?
Jeśli już taką metodą, to nie wydaje mi się, żeby interface był dobrym rozwiązaniem, jeśli już to klasa abstrakcyjna (wystarczy jedno dziedziczenie, a nie jedna implementacja i jedno dziedziczenie)
wjkbdg
Wszystko w porządku, podajecie różne sposoby, ale wciąż nikt nie odpowiedział na moje pytanie.
Rozumiem, że interfejsy, dziedzicznie - kolega moli się na ten temat dosyć obszernie wypowiedział, ale jak to wygląda w praktyce?
1. W jaki inny sposób niż z wykorzystaniem konstruktora mogę utworzyć obiekt jednej klasy wewnątrz drugiej klasy.
2. Dziedziczenie... hm. Trochę trudno mi to sobie wyobrazić w kontekście takich klas jak news i upload bo nie wiem co jedna po drugiej ma dziedziczyć, skoro ich funkcjonalność jest zupełnie inne i nie łączy ich nic poza potrzebą wykorzystania uploadu w przypadku newsów.
Shili
Dla przykładu:
2) Niekoniecznie jedna dziedziczy po drugiej, ale obie dziedziczą po wspólnej klasie, która ma zaimplementowaną tą wspólną metodę.

1) dla najprostszego przykładu:
  1. <?php
  2. class HasForeignObject
  3. {
  4.  private $sql;
  5.  
  6.  public setSql(Sql $data)
  7.  {
  8. $this->$sql = $data;
  9.  }
  10.  
  11. }
  12. ?>


Gdzie Sql to oczywiście klasa bazy danych.
I masz dostęp do obiektu klasy bez użycia w tym celu konstruktora.
likemandrake
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.

  1. <?php
  2. interface iNewsUploader {
  3. public function upload(News $oNews);
  4. public function download(News $oNews, $iIdNews);
  5. }
  6.  
  7. class Uploader {
  8. /* jakis tam zestaw metod */
  9. }
  10.  
  11. class NewsUploader implements iNewsUploader {
  12. protected $oUploader;
  13.  
  14. public function __construct(Uploader $oUploader) {
  15. /* wiadome operacje */
  16. }
  17. public function upload(News $oNews) {
  18. /* wiadome operacje - pobranie tresci newsa oraz obrazkow lub sciezek obrazkow - zalezy co tam sobie wybierzesz */
  19. }
  20. public function download(News $oNews, $iIdNews) {
  21.  /* wiadome operacje - pobranie newsa skads tam na podstawie jego id */
  22. }
  23. }
  24.  
  25. class News {
  26. protected $iIdNews;
  27. protected $oUploader;
  28. protected $sContent;
  29. protected $aImages;
  30.  
  31. public function __construct($iIdNews = null) {
  32.  /* wiadome operacje */
  33. }
  34. public function setUploader(iNewsUploader $oUploader) {
  35. /* wiadoma operacja */
  36. }
  37. public function addImage($sImgPath) {
  38. /* dodanie do tablicy obrazkow */
  39. }
  40. public function setContent($sContent) {
  41. /* ustawienie tresci newsa */
  42. }
  43. public function getContent() {
  44. /* z tej metody moglaby korzystac klasa newsuploader do pobrania zawartosci opisu
  45. newsa */
  46. }
  47. public function getImage() {
  48. /* z tej metody moglaby kozrystac klasa news uploader do pobrania jednego obrazka
  49. (lub sciezki do obrazka), kazde nastepne wywolanie zwracaloby
  50.  * kolejny obrazek z tablicy az do momentu zwrocenia wartosci false */ 
  51. }
  52. public function save() {
  53. /* wywolanie metody upload klasy NewsUploader do zapisu zawartosci */
  54. $this->oUploader->upload($this);
  55. }
  56. public function load() {
  57. /* wiadome operacje */
  58.  $this->oUploader->download($this, $this->iIdNews);
  59. }
  60. }
  61.  
  62. $oUploader = new Uploader();
  63. $oNewsUploader = new NewsUploader($oUploader);
  64. $oNews = new News();
  65. $oNews->setUploader($oNewsUploader);
  66.  
  67. $oNews->setContent('Tralala');
  68. $oNews->addImage('sciezunia/obrazek.jpg');
  69. ?>


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
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.