Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przyjmowanie roznej ilosci zmiennych do konstruktora
Forum PHP.pl > Forum > PHP
SkuterPL
Witam,
Probuje zrobic konstruktor, ktory bedzie w stanie przyjmowac rozna ilosc zmiennych, zalezne czy np srodkowa zmienna bedzie ustawiona na true to chce dodatkowe 2 zmienne, zas jesli jest false to nie chce ich, wszystko wytlumaczylem w tym pliku:

http://wklej.org/id/1334876/

Wie ktos jak to rozgrysc?
in5ane
Nawet np. tak:
  1. function __construct ($nazwa = null, $katalog = null, $maksymalna_waga = null, $szerokosc = null, $wysokosc = null, $obrazek = null, $kasowanie = null, $do_kasacji = null, $miniaturka = null, $szerokosc_min = null, $wysokosc_min = null)
Z tym, że jeśli chcesz podać np. 1, 2 i 5 argument, to musisz podać również 3 i 4, może je podać jako null.

@edit: ogólnie zamiast null'ów powinny być odpowiednie typu, np. jak ma być tablica to dać array(), albo gdy ma być boolean zawsze to dać false itd.
Pyton_000
  1. function __construct ($nazwa = '', $katalog = '', $maksymalna_waga = 0, $szerokosc, $wysokosc, $obrazek, $kasowanie, $do_kasacji, $miniaturka, $szerokosc_min, $wysokosc_min)


i analogicznie reszta zmiennych

Tak poza tym to trochę za dużo tych zmiennych. Już lepiej dać 1 jako tablicę zmiennych.
SkuterPL
wlasnie na cos podobnego juz wpadlem, ze 2 ostatnie nie musze wypisywac, ale za to np jak juz chce srokodowa podac, to wlasnie musze te kilka podac jako NULL czy FALSE tez, wiec inaczej tego nie idzie rozwiazac?
Bo jak probowalem robic, aby nie podawac tylu zmiennych, to kolejnosc sie nie zgadzala i sie spieprzylo.
Wazniak96
No to tak jak napisał kolega @Pyton_000 przekazujesz do konstruktora tablicę z parametrami. Tylko stwórz sobie tablicę asocjacyjną to Ci się kolejność nie pomiesza smile.gif
Pyton_000
Możesz się zainteresować jeszcze tym: func_get_arg
SkuterPL
Dobra dzieki za rady, bede podwal w sordku 2 razy false, lub true i nazwa pliku do kasacji, a ostatnie parametry bede mogl sobie odpuscic.
lukaskolista
Tylko po co? IMO zle do tego podchodzisz (wiem, na studiach tez mnie uczyli tak tworzyc obiekty). Nie lepiej stosowac setery?
  1. $obj = new TwojaKlasa()->setProperty1('val1)->setProperty2('val2');

lub po prostu zrobic te wlasciwosci publiczne i je poustawiac?
SkuterPL
Nie znam tych seterow, to jakies gotowe funkcja?
Pyton_000
to zwykła metoda która zwraca obiekt (w tym przypadku obiekt z którego podchodzi) dzięki temu można zastosować chain-ing
matix
IMHO tyle parametrów w konstruktorze to błąd na etapie projektowania. Lepiej (moim zdaniem) zrobić tak, że konstruktor będzie przypisywał defaultowe wartości do atrybutów, a ich zmiana będzie odbywać się za pomocą metod. Nazwałbym tą klasę ... nie wiem... ImageService?

  1. __construct($name, $destinationDirectory = self::DEFAULT_DESTINATION_DIRECTORY)
  2. setDestinationDirectory($directory)
  3. setDeletable($deletable)
  4. setThumbnailable($thumbnailable)


Reszta (typu max szerokośc, wysokość) zrobiłbym jako reguły walidacyjne, np:
  1. attachValidation(new Validation\Image\Height([0, 300])); // zakres 0-300px
  2. attachValidation(new Validation\Image\Width([0, 800])); // zakres 0-800px


Trochę więcej zabawy, ale będzie się ładnie rozszerzało potem.

Wiem, że to trochę na chwilę obecną przyrost, ale wykonanie takiej klasy poprawnie to 2h, a w przyszłości się to zwróci.

M.
SkuterPL
ustawienie deaufltowych wartosci mi sie nie przyda, bo te pierwsze 6 zmiennych zawsze bede podawal bo beda inne.
Jedynie te ostatnie 4 maja domyslna wartosc smile.gif

Ale dzieki za rady wszystkim.
thek
Skoro masz X wartości zawsze, to tylko z nimi zrób konstruktor. Zauważ, że pozostałe rzeczy są opcjonalne i tak naprawdę to osobne operacje, czyli coś, czym tak naprawdę konstruktor nie powinien się zajmować. Wydziel to jako osobne metody.
  1. class Photo {
  2. public function __construct ($nazwa, $katalog, $maksymalna_waga, $szerokosc, $wysokosc, $obrazek) { /* kod */};
  3. public function drop ($filepath) { /* kod */ };
  4. public function thumb ($szerokosc_min, $wysokosc_min) { /* kod */};
  5. }

Choć jak dla mnie, to źle podchodzisz do tego. Czemu? Bo do operacji na obrazie powinieneś w jakiś sposób przekazać uchwyt do pliku, ścieżkę czy coś w tym stylu... Nie nazwę inputa. To słabe, bo nieelastyczne podejście. A co jeśli będziesz operował na obrazach nieformularzowych? Tak naprawdę do konstruktora potrzebny Ci plik lub ścieżka do niego. Wszystko inne konstruktor sam może ustawić. Bo i co Ci potrzebne? Konstruktor wysokość i szerokość sam odczyta przy próbie odczytu pliku. Nazwę i katalog podasz jako parametr przy funkcji save(). Miniaturka to co? Nic innego jak funkcja obróbki. A więc dochodzi Ci resize() lub crop(), zależnie od sytuacji i potem save() smile.gif Samo save() co to takiego? Zależnie od kontekstu albo zapis do pliku albo bezpośredni wysył streama do przeglądarki z odpowiednim nagłówkiem. Sam pomyśl nad właściwą budową klasy i jej metodami, bo to co kombinujesz to jest jakiś overkill, gdzie samym konstruktorem robisz pierdyliard rzeczy, choć można je na prostsze, bardziej elementarne funkcje rozpisać. Na dodatek jeśli zastosujesz chaining, to możesz to ciurkiem zrobić.

EDIT: To oczywiście tyczy się samej klasy obrazu. Jeśli chcesz z kolei to wziąć pod uwagę jako pole file do walidacji w formularzu to... prześlij obiekt swojej klasy i reguły walidacji, które potem porównasz z właściwościami obiektu swej klasy. Przykład? Tworzysz formularz z polem typu file o nazwie 'photo' i odpowiednimi regułami walidacji:
  1. $form->add('photo', 'file', [
  2. 'valid' => [
  3. 'maxWidth' => 300,
  4. 'maxHeight' => 300,
  5. 'maxWeight' => 280000,
  6. 'allowedTypes' => [
  7. 'image/jpeg', 'image/gif', 'image/png'
  8. ]
  9. ]
  10. ]);


A najlepiej te reguły w osobną klasę walidacji opakuj, by w razie czego każda reguła to był osobny obiekt, z własnymi komunikatami, parametrami i tak dalej. Bo i wtedy możesz na całość jeszcze translacje oraz inne cuda założyć. Wtedy w razie błędu obiekt zwróci swój własny komunikat. Sam formularz wtedy się zajmie czym trzeba. Pamiętaj, że wszystko ma swoją dziedzinę. Podziel całość, wydziel zakresy działalności i... uprość jak się da, ale nie bardziej smile.gif
SkuterPL
ja mam zrobione to podobnie jak piszesz, mam konstruktor, ktory przyjmuje te wszystkie zmienne, do tego dla kazdej operacji mam inna funkcje, a przyjmuje wszystko w konstruktorze, aby on sprawdzil czy ma wywolac dana funkcje, aby jej nie potrzebnie nie wywolywac w kodzie docelowym. Wystarczy, ze uruchomie klase i automatycznie konstuktor mi sprawdzi jakie funkcje powinien odpalic, wiec uzytkownik ustawiajac tylko 1 linijki kodu, wlacza caly upload zdjecia smile.gif
destroyerr
Złe podejście: masz tyle argumentów w konstruktorze bo Twój obiekt ma zbyt wiele odpowiedzialności. Powinieneś to rozdzielić na różne obiekty. No ale skoro uważasz, że kod jest dobry kiedy wszystko dzieje się po uruchomieniu konstruktora to pewnie będzie Ciebie ciężko przekonać.
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.