Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Programowanie obiektowe
Forum PHP.pl > Forum > Przedszkole
Nutri
Witam, otóż aktualnie poznaje programowanie obiektowe, jednak nasuwa mi się pewne pytanie na które nie mogłem odnaleźć do tej pory odpowiedzi stąd moja wizyta tutaj.

Otóż analizując kod jakiejś tam strony zwróciłem uwagę na kilkukrotne wywołanie wskaźnika do funkcji ->
I teraz chciałem zapytać jak i czy można zapisać tak klasę aby miała metody pokoloruj pogrub itd a następnie w wywołaniu użyć

$text = new text();

$text->pokoloruj()->pogrub()->napis("witam");

Czy ktoś może mi podpowiedzieć jak napisać taką klasę ?
nospor
po prostu każda z metod ma zwracać swój obiekt

....
return $this;
i już.
Nutri
  1. <?php
  2.  
  3. class text{
  4.  
  5. var $str;
  6.  
  7. function pokoloruj(){
  8. $this->str = '<font color="red">'.$this->str.'</font>';
  9. return $this;
  10. }
  11.  
  12. function pogrub(){
  13. $this->str = '<b>'.$this->str.'</b>';
  14. return $this;
  15. }
  16.  
  17. function napis($napis){
  18. $this->str = $napis;
  19. return $this;
  20. }
  21.  
  22. }
  23.  
  24. $text = new text();
  25. echo $text->pokoloruj()->pogrub()->napis("witam");
  26.  
  27.  
  28. ?>



To może inaczej dlaczego to nie działa?
nospor
Przecież napisałem wyraźnie: metoda ma zwracać return $this;
Widzisz u siebie gdzieś cos takiego? No własnie, i dlatego nie działa.
phpion
Cytat(nospor @ 12.12.2011, 09:08:50 ) *
return $this;

Nutri
Przepraszam, teoretycznie mi to działa zamieniłem sobie na takie coś:
  1. <?php
  2.  
  3. class text{
  4.  
  5. var $str;
  6.  
  7. function pokoloruj(){
  8. $this->str = '<font color="red">'.$this->str.'</font>';
  9. return $this;
  10. }
  11.  
  12. function pogrub(){
  13. $this->str = '<b>'.$this->str.'</b>';
  14. return $this;
  15. }
  16.  
  17. function napis($napis){
  18. $this->str = $napis;
  19. return $this;
  20. }
  21.  
  22. function ret(){
  23. return $this->str;
  24. }
  25.  
  26. }
  27.  
  28. $text = new text();
  29. echo $text->napis("witam")->pokoloruj()->pogrub()->ret();
  30.  
  31. ?>


ale mam teraz pytanie, jezeli użyje tego :
text->pokoloruj()->pogrub()->napis("witam")->ret(); // wyswietli tekst pomijając metody pokoloruj i pogrub

Oczywiście wiem, dlaczego ( ponieważ nie ma żadnego stringa do pokolorowania ) a da sie pozniej tego stringa wkleić tak aby ta funkcja przyjmowała właśnie taką kolejność jaka jest podana?
Crozin
A włączysz myślenie czy będziesz z każdym błędem tutaj leciał? Wklepanie treści błędu do Google'a, od razu nakieruje Cię na manual i bardzo jasny opis co wtedy zrobić: http://www.php.net/manual/en/language.oop5....magic.tostring
Dipter
Ustawiasz napis po użyciu metod pokoloruj i pogrub, więc to raczej zła kolejność rzeczy. Przekaż napis chociażby w konstruktorze __construct.
Nutri
Cytat(Dipter @ 12.12.2011, 09:28:35 ) *
Ustawiasz napis po użyciu metod pokoloruj i pogrub, więc to raczej zła kolejność rzeczy. Przekaż napis chociażby w konstruktorze __construct.


Tak napisałem, ze wiem jaki jest problem, ale czy istnieje jakaś prosta funkcja na wklejenie mojego stringa w środek? Bu chyba po pierwszych 2 metodach moj string przyjmuje wartość :
<b><font color="red"></font></b>
nospor
$text->napis("witam")->pokoloruj()->pogrub()->ret();
Nutri
Cytat(nospor @ 12.12.2011, 09:35:08 ) *
$text->napis("witam")->pokoloruj()->pogrub()->ret();



Tak to też napisałem, jednak tak dla zaspokojenia ciekawości pytam was czy istnieje funkcja która będzie dodawała w środek aktualnego stringa?

Wiem mniej więcej jak to zrobić za pomocą explode tylko, że będę musiał najpierw rozdzielić a następnie połączyć tabele
Crozin
Powinieneś trzymać tekst i jego style odseparowane od siebie:
  1. class Text {
  2. private $text = '';
  3. private $styles = array();
  4.  
  5. ...
  6.  
  7. public function setColor(Color $color) {
  8. $rgb = $color->getRGB();
  9. $this->styles['color'] = sprintf('rgb(%d, %d, %d)', $rgb['red'], $rgb['green'], $rgb['blue']);
  10. }
  11.  
  12. public function __toString() {
  13. $styles = array();
  14.  
  15. foreach ($this->styles as $style => $value) {
  16. $styles[] = $style . ': ' . $value;
  17. }
  18.  
  19. return '<span style="' . implode('; ', $styles) . '">' . $this->text . '</span>';
  20. }
  21. }
Da Ci to możliwość nadpisywania wcześniej ustalonych stylów oraz rozdzieli różne elementy struktury od siebie.
Nutri
Dziękuje wszystko mi to wyjaśnia.
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.