Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [PHP]Programowanie obiektowe
Nutri
post
Post #1





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


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ę ?

Ten post edytował Nutri 12.12.2011, 09:08:30
Go to the top of the page
+Quote Post
nospor
post
Post #2





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




po prostu każda z metod ma zwracać swój obiekt

....
return $this;
i już.
Go to the top of the page
+Quote Post
Nutri
post
Post #3





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


  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?

Ten post edytował Nutri 12.12.2011, 09:20:42
Go to the top of the page
+Quote Post
nospor
post
Post #4





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




Przecież napisałem wyraźnie: metoda ma zwracać return $this;
Widzisz u siebie gdzieś cos takiego? No własnie, i dlatego nie działa.
Go to the top of the page
+Quote Post
phpion
post
Post #5





Grupa: Moderatorzy
Postów: 6 072
Pomógł: 861
Dołączył: 10.12.2003
Skąd: Dąbrowa Górnicza




Cytat(nospor @ 12.12.2011, 09:08:50 ) *
return $this;

Go to the top of the page
+Quote Post
Nutri
post
Post #6





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


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?

Ten post edytował Nutri 12.12.2011, 09:27:12
Go to the top of the page
+Quote Post
Crozin
post
Post #7





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Dipter
post
Post #8





Grupa: Zarejestrowani
Postów: 81
Pomógł: 14
Dołączył: 28.11.2010
Skąd: Kraków

Ostrzeżenie: (0%)
-----


Ustawiasz napis po użyciu metod pokoloruj i pogrub, więc to raczej zła kolejność rzeczy. Przekaż napis chociażby w konstruktorze __construct.
Go to the top of the page
+Quote Post
Nutri
post
Post #9





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


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>

Ten post edytował Nutri 12.12.2011, 09:32:16
Go to the top of the page
+Quote Post
nospor
post
Post #10





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




$text->napis("witam")->pokoloruj()->pogrub()->ret();
Go to the top of the page
+Quote Post
Nutri
post
Post #11





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
Crozin
post
Post #12





Grupa: Zarejestrowani
Postów: 6 476
Pomógł: 1306
Dołączył: 6.08.2006
Skąd: Kraków

Ostrzeżenie: (0%)
-----


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.
Go to the top of the page
+Quote Post
Nutri
post
Post #13





Grupa: Zarejestrowani
Postów: 7
Pomógł: 0
Dołączył: 12.12.2011

Ostrzeżenie: (0%)
-----


Dziękuje wszystko mi to wyjaśnia.
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 16.09.2025 - 19:40