Administratorzy gnysek Opublikowano 4 Czerwca 2008 Administratorzy Udostępnij Opublikowano 4 Czerwca 2008 Dobra załóżmy że mam taką klasę (teoretycznie, na prawdę jest dużo bardziej rozbudowana i trochę pozmyślałem): class silnik { function error($jaki_blad) { echo $jaki_blad; die(); } } $silnik=new silnik i drugą klasę: class test { public $time= 0; function ten_czas($czas) { global $silnik; if ($time<>$czas) { $time->error('błąd'); } else { return true; } } } jeżeli funkcji będzie więcej, ciąglę będę musiał pamiętać, aby dodać global $silnik. Czy można jakoś inaczej udostępnić klasie inną klasę (nie używając słowa new, bo chciałbym, aby była dostępna też dla innych) ? Czy muszę tę klasę silnik napisać tak, żeby każda kolejna klasa mogła jej używać jako $this->costam = new $silnik (co jest głupie bo po co sto razy definiować coś, co nie potrzebuje tego ?) ?? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 4 Czerwca 2008 Udostępnij Opublikowano 4 Czerwca 2008 Zrób z klasy singleton lub poprostu class Silnik { private static $cos; public static function funkcja($value) { self::$cos=$value; } } Potem: Silnik::funckja('haha'); A tak wogóle to jakie PHP ty chcesz to uzywać? #edit Widać że obiektowośc u ciebie kuleje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 4 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 4 Czerwca 2008 Za mało danych żeby cokolwiek powiedzieć. Singleton odpada, bo nie po to się go stosuje. Można użyć klasę statyczną, jak zasugerował kofel, ale to też jest uzależnione od tego czy chcesz tworzyć obiekt silnika czy nie. Zostają dwa wyjścia - albo dziedziczenie, jeżeli test jest w jakimś sensie pochodną silnika, albo przekazywani obiektu przez konstruktor i w konstruktorze przypisanie jej do prywatnego pola (zmiennej), do której potem się już będziesz odwoływał za pomocą this. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 4 Czerwca 2008 Udostępnij Opublikowano 4 Czerwca 2008 Jakto singleton odpada? ;o A mi się wydaje że dobry jest w tej sytuacji kolego. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 4 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 4 Czerwca 2008 dobra, zrobiłem coś takiego class B { public $a = null; function B() { global $a; $this->a = & $a; } } po prostu klasy A potrzebuję w kilku innych klasach, bo tam są różne ważne funkcje, a dawanie ciągle global jest niepraktyczne i łatwo cos przegapić. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 4 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 4 Czerwca 2008 Jakto singleton odpada? ;o A mi się wydaje że dobry jest w tej sytuacji kolego.Bo? Jak się zarzuca jakimś pomysłem, to warto potroszę wytłumaczyć. Wiesz w ogóle w jakich sytuacjach stosuje się singleton? (nie pytam się czym jest). Znać wzorce projektowe != umieć je dobrze wykorzystać. @Gnysek: Kurde, klasy czy obiektu? To jest zasadnicza różnica. Jeśli klasy, to statyczna, jeśli obiekt, to czy będzie się powtarzać? Jeśli nie, to też statyczna. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 A to może singleton jest w tej sytuacji zły? ;o <?php class Any { private static $instance; public $errnum; public static function getInstance() { return ($i = &self::$instance) ? $i : $i = new self; } public function error($text) { $this->errnum ++; echo '<div style="text-size: 16px; border: 1px solid red; padding: 5px; margin: 5px;">'.$text.'</div>'; return true; } } class OtherClass { function __construct() { Any::getInstance()->error('OtherClass created.'); } public function err($text) { Any::getInstance()->error('Error: '.$text); } } $wtf = new OtherClass; $wtf->err('LOL'); $wtf->err(Any::getInstance()->errnum); ?> Zobacz to Gnysek. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 5 Czerwca 2008 Nie nie, ja chcę errora z różnych klas wywalać, np. B, C, D. Konkretnie z funkcji tych klas, ale sama funkcja wywalająca błędy i robiąca mi logi jest w klasie A. Czyli załóżmy, że klasa A to taki główny silnik strony, a klasy B, C, D to kolejne klasy potrzebne do modułów, np. obsługa bazy danych, sesje itd, ale wszędzie błędy są wywalane w ten sam sposób, więc chciałbym korzystać z funkcji error() klasy A którą zawsze tworzę jako pierwszą, bo jest mi na stronie do wielu innych rzeczy potrzebna. A skoro już istnieje to po co duplikować ją w pozostałych klasach, czy też używać global $klasa ? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 @Kofel: No i pokazałeś jak wygląda przykładowa implementacja singletonu, ale nie wyjaśniłeś dlaczego tutaj ma zastosowanie... a takowego w tym przypadku właśnie nie ma. Gnysek nie napisał czy musi mieć obiekt silnika czy też klasę, a jeśli obiekt to czy koniecznie jeden. Singleton tylko i wyłącznie stosujemy gdy obiekt danej klasy może być tylko jeden, unikatowy. Jeżeli ten warunek jest niespełniony / niejasny, to automatycznie nie stosujesz danego wzorca projektowego, bo to jest sprzeczne z ich ideą. @Gnysek: Rozwiązań jest parę: 1) Korzystać z wyjątków, try catch oraz pobudować własne klasy wyjątków 2) Silnik powinien być w całości klasą statyczną. Wtedy dostęp do jej publicznych metod masz z każdego miejsca skryptu, bez stosowania global. 3) Utworzyć klasę abstrakcyjną (czyli taką, której obiektu nie można stworzyć) do obsługi błędów, a następnie dziedziczyć ją w klasach "modułach". Wybór należy do Ciebie. Weź na tapetę rozwiązanie numer 2, najłatwiejsze do napisania. :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 5 Czerwca 2008 gnysek nie napisał czy musi mieć obiekt silnika czy też klasę, a jeśli obiekt to czy koniecznie jeden. Tworzę np. $silnik = new silnik i nie chcę już więcej go tworzyć, potem tworzę np. drugą klasę ($klasa=new klasa) i chciałbym mieć w niej dostęp do funkcji z klasy $silnik, nie tworząc jej kolejny raz. Wydaje mi się, że drugie rowziązanie właśnie rozwiązuje ten problem, ale sprawdzę dopiero w domu. Bo sprawdzałem na GMC, ale tam do $core odwołujesz się poprzez global $core, ale trzeba zauważyć, że strona była pisana 100 lat temu :P Tak to jest jak się pisze pół w PHP4 a pół w PHP5... chyba sie przejde do empiku zaraz po jakąś dobrą ksiażkę z klasami w PHP5 :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 Aktualny silnik GMCLANu przecież był napisany jeszcze przed wydaniem PHP5, w związku z czym nie miałem ani abstrakcji, ani statyczności, ani własnych wyjątków, ani możliwości stworzenia singletona, na którego nie wiem czemu uparł się Kofel. Nowy silnik planuję oprzeć na ww. technikach + interfejsy i silnym naciskiem na refleksje (wpływ C#, chęć zasymulowania atrybutów). Nie wiem tylko czy zaszaleć i już w php 5.3 kodzić z wykorzystaniem przestrzeni nazw. A po co to wszystko? Żeby silnik był najbardziej modułowy jak tylko się da. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 5 Czerwca 2008 Toż przecież wiem, ze wtedy nie było PHP5, dlatego sam mam przyzwyczajenia niedobre jeszcze i dopiero je zmieniam :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Gnysek, bez komentarza. Ranmus, też bez komentarza. Tematu niechce wałkować bo programista ze mnei żaden ale bym tu zastosował singleton jeśli chcesz mieć jeden OBIEKT wszędzie dostępny. ;s Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 Jennnny, Kofel. Jeżeli to jest silnik strony, np. zbiór funkcji, narzędzi itd., to mu żaden obiekt nie jest potrzebny i automatycznie singleton odpada. :/ Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 To jaki kurde problem zrobić klase statyczną? Kurde, wałkować temat. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 No żaden. No przecież gnysek się pytał o poradę w tej sprawie. :) Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Napisałem w pierwszym poście o KLASIE STATYCZNEJ. To poco dalej wałkować ten temat? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
BeWuO Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Przecież klasa statyczna to swojego rodzaju singleton ;] Wiem wiem, że nie jest to to samo, ale gadacie o tym samym ;] Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 #up Co? Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 Nie gadamy, bo po co tworzyć obiekt i singleton, skoro można statyczną? Łatwiej, lepiej, bezpieczniej. W tym momencie tworzenie obiektu i singletona jest nieuzasadnione. Zresztą singleton służy do czego innego. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 To może Ranmus odrazu wytłumacz do czego służy singleton, ja jestem nie obeznany w tym temacie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
BeWuO Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Ej, Singleton to idea a nie od arzu konkretna implementacja ;] A myślisz że po co są statyczne klasy? Przecież to ewidentnie dodatkowy mechanizm implementujący singleton ;] Ja rozumiem, że dla Ciebie jak jest singleton to musi być obiekt, ale wzorce sie modyfikuje - proste. Poza tym przecież jak sie odwołujesz statycznie do klasy, to istnieje niejawny "obiekt". Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 5 Czerwca 2008 Sorry Kofel, ale zarówno BeWuO jak i Ranmus są dla mnie większymi autorytetami. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 @BeWuo: No ok, ale singleton polega właśnie na implentacji unikalności w przypadku obiektów a nie klas (bo w klasach jest statyczność), więc nie wiem o co się kłócisz? Napisałem, że tutaj singleton jest zbędny, bo i tworzenie obiektu jest zbyteczne. Wszystko można rozwiązać klasą statyczną. A singleton różni się od statyczności paroma rzeczami, np. konstruktor (w niektórych językach przy statycznej klasie albo nie jest wywoływany w ogóle albo nie wiadomo kiedy). Poza tym co z interfejsami i rzutowaniem obiektu na dany interfejs? Co z dziedziczeniem klas abstrakcyjnych? I właśnie tutaj dochodzimy do tego momentu, w którym musimy sobie zadać pytanie jak chcemy daną klasę wykorzystywać. Czy jako klasę statyczną czy obiekt, bo operowanie obiektem jest zdeczka inne niż klasą i różni się możliwościami. Przecież nie odpowiem jasno na pytanie co jest w danym momencie lepsze, bo nie znam wszystkich kryteriów danej sytuacji. @Kofel: Moim zdaniem singleton służy do NIEJAWNEGO zwracania tego samego (unikatowego) obiektu, np. innym zainteresowanym obiektom. Dla nich nie będzie ważne czy to ten sam obiekt czy nie, ważne że otrzymują obiekt tego samego typu jakiego chcą i tyle. Przy czym stosowanie singletona = operowanie na obiekcie = mamy jakieś określone przesłanki by operować na obiekcie a nie statycznej klasie. Przesłanki mogą być takie jak powyżej... np. w C# jeżeli mam cały uniwersalny system zarządzania modułami w postaci obiektów, to będę mógł dodać do niego nowy moduł oparty na obiekcie (zwracanym przez singleton), co z kolei nie uda mi się w przypadku klasy statycznej. Ej, Singleton to idea a nie od arzu konkretna implementacja ;] A myślisz że po co są statyczne klasy? Przecież to ewidentnie dodatkowy mechanizm implementujący singleton ;] No hmm... Ale czy ja pisałem o konkretnej implementacji? NIE, ja pisałem tylko o przesłankach użycia w konkretnym problemie. Tak, statyczność to swego rodzaju singleton, ale nie do końca... patrz powyżej co napisałem. Ja rozumiem, że dla Ciebie jak jest singleton to musi być obiekt, ale wzorce sie modyfikuje - proste.No ok, ale czy znasz implementację singletonu nie na obiektach? Przecież stworzyć tego na klasach statycznych się nie da. @Bewuo: Poza tym zachowujesz się jak Kofel. Na siłę można by zrobić singletona w gnyskowym przypadku, tylko po co? Jest to nieergonomiczne, zbędnie i w ogóle. Lepiej klasę statyczną lub abstrakcyjną dziedziczoną. Po co utrudniać sobie życie? Po to właśnei wymyślono wzorce projektowe, by je stosować do konkretnych sytuacji, a gnyskowa takową nie jest. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
BeWuO Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Nie wiem o co Ci chodzi. Czy ja napisałem, że tu trzeba zaimplementować obiekt wg. wzorca singletonu? Nie czytasz uważnie. Ja tylko chciałem pokazać, że statyczność w pewnym sensie jest przykładem singletonu. Bo o co chodzi w singletonie? Żeby był unikatowy obiekt jednej klasy. A statyczność prowadzi do tego ;] Także jeszcze raz powiem, że chciałem wyjaśnić idee, a nie wchodzić w implementacje. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Filar Społeczności Ranmus Opublikowano 5 Czerwca 2008 Filar Społeczności Udostępnij Opublikowano 5 Czerwca 2008 No zgadzam się. Dlatego też implementacja singletona wymaga DODATKOWYCH przesłanek uzycia, a w gnyska problemie takowych nie ma, wiec automatycznie stosujemy klase statyczna, bo tworzenie singletona i obiektu jest calkowicie zbyteczne i nieergonomiczne. Tak wiec nie wiem po co sie czepiasz, BeWuO. Zawsze w przypadku takiego dylematu stosuje sie najlatwiejsze rozwiazanie, a nie komplikuje sobie zycie. Poza tym jak juz wczesniej napisalem, statycznosc to nie tylko unikatowosc, bo prowadzi do calkiem innego zastosowania. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 gnysek, ja pierdole kto jest twoim autorytetem, Podałem najlepsze rozwiązanie w pierwszym poście, więc poco wałkować temat? Moja odpowiedź też była prawidłowa tak samo jak Ranmusa i BeWuO. Co do tematu to przyznaje głupi pomysł z singletonem, żaden ze mnie doświatczony programista (dopiero pierwszy rok programowania) , sorry za moje posty. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Administratorzy gnysek Opublikowano 5 Czerwca 2008 Autor Administratorzy Udostępnij Opublikowano 5 Czerwca 2008 A mi Twoje rozwiązanie nie odpowiada i tyle :) Btw. za wulgarność dostajesz ostrzeżenie. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Kofel Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 gnysek, to rozwiązanie ci się nie podoba o którym mówi także gnysek że będzie najlepsze? Coś kręcisz. ;] W TYM WYPADKU NAJLEPSZA BĘDZIE KLASA STATYCZNA. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
BeWuO Opublikowano 5 Czerwca 2008 Udostępnij Opublikowano 5 Czerwca 2008 Ranmus: Ja sie czepiam? ;] Co Ty dajesz... :P Ja chce Ci kolejny raz wytłumaczyć, że nie chodzi mi o ten konkretny przykład tylko o pokazanie że statyczność jest w pewnym sensie analogią do singletonu. Odnośnik do komentarza Udostępnij na innych stronach Więcej opcji udostępniania...
Rekomendowane odpowiedzi
Jeśli chcesz dodać odpowiedź, zaloguj się lub zarejestruj nowe konto
Jedynie zarejestrowani użytkownicy mogą komentować zawartość tej strony.
Zarejestruj nowe konto
Załóż nowe konto. To bardzo proste!
Zarejestruj sięZaloguj się
Posiadasz już konto? Zaloguj się poniżej.
Zaloguj się