Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] problem z klasą tudzież konstruktorem.
Forum PHP.pl > Forum > Przedszkole
Coolmax
Chciałbym się przerzucić na programowanie obiektowe. Przykład z manuala mi nic nie mówił dopiero po wiki i tym artykule rozumiem sens programowania obiektowego. Wiąże się z tym to, że już wyskakują mi proste błędy. Jeden z nich: Mam klasę. Wewnątrz niej chcę umieścić dwie funkcje. Różnią się tylko jedną zmienną:

  1. <?php
  2. $allfile = file("http://www.jakasstrona.pl/nowosci/news".$id.".asp"); //w każdej z oby dwu funkcji $id jest przekazywane z zewnątrz i jest takie samo
  3. $txt = $allfile[$b] //dla drugiej funkcji $b ma inną wartość.
  4. ?>


I jak teraz umieścić resztę kodu, który jest taki sam? Próbowałem objąć go do funkcji jako konstruktor:

  1. <?php
  2. class example {
  3. function title($id) {
  4. global $id;
  5. $b = '321';
  6. $this->example($id, $b);
  7. }
  8. function content($id) {
  9. global $id;
  10. $b = '322';
  11. $this->example($id, $b);
  12. }
  13.  
  14. function example($id, $b) {
  15. $allfile = file("http://www.jakasstrona.pl/nowosci/news".$id.".asp");
  16. $txt = $allfile[$b];
  17. if(strpos($txt, "class="ImgNews"")) {
  18. $start = strpos($txt, "</a>")+4;
  19. $to = strpos($txt, "</div>");
  20. }
  21. else {
  22. $start = strpos($txt, "<div>")+5;
  23. $to = strpos($txt, "</div>");
  24. }
  25. $all = $to - $start;
  26. $new = strip_tags(substr($txt, $start, $all));
  27. return $new;
  28. }
  29.  
  30. }
  31. ?>


Dopiero zaczynam programować obiektowo, ale nie mam pojęcia, co jest źle. Tworząc nowy obiekt wywala błędy, że brakuje pierwszego i drugiego argumentu. chociaż podaje mu argument $id...
Cysiaczek
@Coolmax - Nie odbierz tego źle, ale ten kod jest troszkę dziwny. Piszesz, że zrozumiełes zasady programowania obiektowego po przeczytaniu tamtych artykułów. Własnie je przejrzałem - sa tak beznadzuejne, że więcej do niech nie wracaj.
W ciele klasy używasz
  1. <?php
  2. $this->example($id, $b);
  3. ?>


Funkcja o nazwie takiej samej jak nazwa klasy jest konstruktorem klasy, czyli funkcją wywoływaną automatycznie przy tworzeniu obiektu. Robi ię to tak
  1. <?php
  2. $obiekt=new example($id, $b);
  3. ?>


Kolejna sprawa, to użycie przez Ciebie zmiennych globalnych w klasie. Nie chce się nad tym rozwodzić, ale ie powinno się pod żadnym pozorem korzystac ze zmiennych globalnych!

Wogóle nie napisałeś jak używasz tej klasy. Napisz.

P.S.
W Wikipedi jest wzmianka o formie i materii u Arystotelesa - Nie wiem kto to pisał, więc moge tylko... BUHAHAHAHAHAHA
Coolmax
Jak inaczej objąć wspólny kod dla oby dwu funkcji? Nowy obiekt tworzę zwyczajnie:
  1. <?php
  2. $ex = new example;
  3. echo $ex->content('8515');
  4. ?>

Cytat
(...) jest konstruktorem klasy, czyli funkcją wywoływaną automatycznie przy tworzeniu obiektu
O tym chyba nie doczytałem... Dlatego pluje się, że brakuje argumentów...
Cysiaczek
Cytat
  1. <?php
  2. $ex = new example;
  3. echo $ex->content('8515');
  4. ?>


No widzisz.
powinno być:
  1. <?php
  2. $ex = new example($id, $b);
  3. echo $ex->content('8515');
  4. ?>

Robiąc new example() wywołujsze przy okazji funkcję o tej nazwie (czyli konstruktor).

2. Dobrze robisz przekazując $b do funkcji. To wystarczy
Coolmax
Próbowałem, ale się nie udało. Rezygnuje z tego sposobu. Jest może jakiś inny spssób na dołączanie tego samego kodu? Jak nie to zapisze go do innego pliku i includuje...
Cysiaczek
Nie rozumiem. Przeciez umiesczesz kod w jakiejś metodzie klasy i przekazujesz jej tylk inne zmienne. To proste jest. Oczywiście jeśli chodzi o obiekty, to nie umieszczej tego w konstruktorze, tylko w innej metodzie.
bigZbig
@Cysiaczek Ty Coolmaxowi opowiadasz o konstruktorach w PHP4 a z jego stopki wynika, ze uzywa php5. Nic dziwnego, ze Twoj przyklad mu nie dziala. Z drugiej strony Coolmax Twoj przyklad by dzialal gdyby metoda content cos zwracala bo narazie nic nie zwraca.
Cysiaczek
W sumie to powienien działać na php 5.0, ale Coolmax pokazywał linki do obiektówki z php4 więc nic nie pisałem o php5, żeby nie mieszać tongue.gif. Mimo to, ze tego co widzę, to wystarczy ten kod umieścić zamiast w konstruktorze - w innej metodzie tej klasy.
Coolmax
Próbowałem w example global $new; i potem w content return $new; ale też nic. Czy przekazują funkcji content paramtr $id, jest on przekazywany dalej do funkcji example?
bigZbig
W tej klasie nie ma konstruktora jesli jest ona pisana w PHP5, ale zgadzam sie ze nazwa metody identyczna z nazwa klasy to niezreczne rozwiazanie.

Cytat(Coolmax @ 27.07.2006, 15:19 ) *
Próbowałem w example global $new; i potem w content return $new; ale też nic. Czy przekazują funkcji content paramtr $id, jest on przekazywany dalej do funkcji example?

Jest, ale zamiast
  1. <?php
  2. function content($id) {
  3. global $id;
  4. $b = '322';
  5. $this->example($id, $b);
  6. }
  7. ?>


Zrób
  1. <?php
  2.  function content($id) {
  3. $b = '322';
  4. return $this->example($id, $b);
  5. }
  6.  ?>
Cysiaczek
Hmm... jednak mam rację laugh.gif jest konstruktorem

Cytat
manual:

For backwards compatibility, if php 5 cannot find a __construct() function for a given class, it will search for the old-style constructor function, by the name of the class. Effectively, it means that the only case that would have compatibility issues is if the class had a method named __construct() which was used for different semantics.
bigZbig
Ok Cysiaczek masz rację. Przyznaję. W koncu chodzi o kompatybilnosc wstecz.
Coolmax
Wielkie dzięki, działa!
bigZbig
Powinno byc tak

  1. <?php
  2. // nazwe klasy zwyczajowo piszemy z wielkiej litery
  3. class Example {
  4. // robimy piekne wciecia
  5. function title($id) {
  6. $b = '321';
  7. return $this->example($id, $b);
  8. } 
  9.  
  10. function content($id) {
  11. $b = '322';
  12. return $this->example($id, $b);
  13. }
  14.  
  15. // Jesli klasa nie ma jawnie zadeklarowanego konstruktora to nie moze miec metod i
    dentycznych 
  16. // z nazwa klasy bo bedzie ona potraktowana jak konstruktor. Na szczescie w tym wy
    padku (po
  17. // poprawce) nazwy klasy i metody roznia sie wielkoscia liter.
  18. function example($id, $b) {
  19. $allfile = file("http://www.jakasstrona.pl/nowosci/news".$id.".asp");
  20. $txt = $allfile[$b];
  21. if(strpos($txt, "class="ImgNews"")) {
  22. $start = strpos($txt, "</a>")+4;
  23. $to = strpos($txt, "</div>");
  24. }
  25. else {
  26. $start = strpos($txt, "<div>")+5;
  27. $to = strpos($txt, "</div>");
  28. }
  29. $all = $to - $start;
  30. $new = strip_tags(substr($txt, $start, $all));
  31. return $new;
  32. }
  33. }
  34. $ex = new Example();
  35. echo $ex->content('8515');
  36. ?>
Coolmax
Znowu mam problem, ale trochę inny... Otóż, aby wyświetlić wartość z metody po returnie. Należy
  1. <?php
  2. class Klasa
  3. {
  4. function Kllasa($start)
  5.  {
  6.  return $start;
  7.  }
  8. }
  9.  
  10. $a = new Klasa();
  11. echo $a->Kllasa('test');
  12. ?>


Nie mogę jednak się uporać z tym w przypadku konstruktora...

  1. <?php
  2. class Klasa
  3. {
  4. function Klasa($start)
  5.  {
  6.  return $start;
  7.  }
  8. }
  9. $a = new Klasa('test');
  10. echo $a;
  11. ?>

Zwraca Object id #1. Jestem b. początkujący, jeśli chodzi o oop, a w wszystkich tutorialach, które mi google znalazł, przykład działania konstruktora jest pokazany na przykładzie echa: manual, http://www.webdiary.pl/modules/manualphp/l...oop.constructor, http://www.php.rk.edu.pl/index.php/site/art/3

Naprawdę nie da się tego w jakiś sposób rozwiązać?
dr_bonzo
Co zwraca konstruktor? Nic, on jest wywolywany przy tworzeniu obiektu, i NIE MOZE wystapic w nim instrukcja return (choc php nic sie nie pluje).
Po prostu uzywaj metody i w niej zwracaj jakas wartosc (tak jak to robisz wyzej)

Konstrukcja
new Klasa(...)
zwraca nowy obiekt tej klasy

Cytat
przykład działania konstruktora jest pokazany na przykładzie echa: manual,
Nic takiego nie znalazlem w rk.edu (drugi link nie zawiera tresci)

Object id #1 -- php wyswietla taki tekst gdy chcesz "wypisac obiekt" (w php5 masz funkcje __toString(), w ktorej definiujesz ciag znakow ktory sie pojawi zamiast tego Object#1.
Coolmax
Rozumiem, zrobię tak jak mówiłeś.
Cytat(dr_bonzo @ 7.08.2006, 18:22 ) *
(...) (drugi link nie zawiera tresci) (...)
W chwili umieszczania linku, treść tam była, naprawdę. blink.gif

P.S
Ciężko jest znaleźć pożądny tutorial z oop dla php5. Wiem, że manual jest ooogromny, ale myślę, że w pierwszej kolejności polski team php powinien właśnie przetłumaczyć rozdział dot. właśnie oop5, ale to tylko moja drobna sugestia.
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.