Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Przekazywanie parametrów funkcji w klasie
Forum PHP.pl > Forum > PHP > Object-oriented programming
Eldiane
Mam pewien problem, mam oto takie dwie funkcje w klasie:
  1. public $przyciski = array('TWORZENIE_STRONY_OBIEKTY.php', 'Button2', 'Button3', 'Button4');
  2.  
  3. public function SprURL($przyciski)
  4. {
  5. for($i=0; count($przyciski) >= $i ; $i++)
  6. {
  7. if(strstr($_SERVER['PHP_SELF'], $przyciski[$i]))
  8. {
  9. $Przycisk_on = $przyciski[$i];
  10. return $Przycisk_on;
  11. }
  12. }
  13. }
  14.  
  15. public function lewe_menu($przyciski)
  16. {
  17. ?>
  18. <table valign="top" border="1" width="100%">
  19. <?php
  20. for($i=0; count($this->przyciski) > $i ; $i++)
  21. {
  22. ?>
  23. <tr>
  24. <td align="center">
  25. <?php
  26. if($this->SprURL($przyciski) == $this->przyciski[$i])
  27. echo $przycisk_on;
  28. else
  29. echo "<a href=\"http://localhost\">".$this->przyciski[$i]."</a>";
  30. ?>
  31. </td>
  32. </tr>
  33. <?php
  34. }
  35. ?>
  36. </table>
  37. <?php
  38. }


Funkcja pierwsza SprURL($przyciski) powinna zwrócić jeden parametr (return $Przycisk_on). Dlaczego gdy wywołam ją w innej funkcji (chodzi tutaj o konstrukcje if, $this->SprURL($przyciski) == $this->przyciski[$i]) nie wysyła tego parametru, już późno być może mózg wysiada ;P ale nie wiem dlaczego tak jest, gdy funkcję zadeklaruje bez klasy wszystko jest OK, zostaje zwrócona wartość, dlaczego natomiast w klasie jest zupełnie inaczej?

Z góry dziękuje
Eldiane
mortus
Zwróć uwagę na linie 26 i 27. W tej chwili skrypt nie wie, czym jest zmienna $przycisk_on i domyślnie nadaje jej wartość null. Po prostu nie przypisujesz zmiennej $przycisk_on wartości, jaką ma zwrócić funkcja SprURL(), co można zrobić w linii 26 w warunku:
  1. if(($przycisk_on = $this->SprURL($przyciski)) == $this->przyciski[$i])

Wszystko działa jak należy.

W wykryciu błędu mogło pomóc włączenie wyświetlania wszystkich błędów zgodnie z zaleceniami w tym temacie.
Eldiane
  1. <?php
  2. $przycisk_on = $this->SprURL($przyciski);
  3. if($przycisk_on == $this->przyciski[$i])
  4. echo $przycisk_on;
  5. else
  6. echo "<a href=\"http://localhost\">".$this->przyciski[$i]."</a>";
  7. ?>


Zmieniając składnie na taką jaką podałeś nadal występuje błąd, zawsze przechodzi do warunku else... Tak jakby zmienna $przycisk_on była nadal wartością NULL thumbsdownsmileyanim.gif
mortus
Po wywołaniu tego:
  1. $przycisk_on = $this->SprURL($przyciski);

sprawdź, czym jest zmienna $przycisk_on:
  1. var_dump($przycisk_on);

Jeśli się okaże, że jej wartość to null, to przeanalizuj funkcję SprURL() sprawdzając przy tym zawartość $_SERVER['PHP_SELF'].
Swoją drogą funkcja SprURL() jest źle napisana, bo nie zwraca jakiejś domyślnej wartości, która niekoniecznie musi się znaleźć w tablicy $przyciski.

W ogóle całość jest do poprawy, bo logiki w tym nie ma żadnej. Na przykład obie funkcje korzystają z tej samej tablicy przycisków, więc po co je przekazywać, jako parametr.
bastard13
Twoje przyciski to:
  1. public $przyciski = array('TWORZENIE_STRONY_OBIEKTY.php', 'Button2', 'Button3', 'Button4');

W metodzie SprUrl() masz warunek:
  1. if(strstr($_SERVER['PHP_SELF'], $przyciski[$i]))

A ze strony http://www.php.net/manual/en/function.strstr.php masz to co zwraca funkcja:
Cytat
Returns the portion of string, or FALSE if needle is not found.


Teraz już powinno wszystko być jasne.

A poza tematem to metoda SprUrl() powinna przyjmować i sprawdzać tylko jeden przycisk, ponieważ teraz w metodzie lewe_menu() wielokrotnie przechodzisz przez tablice $przyciski.
Dodatkowo, jeżeli zostawisz to tak, jak jest teraz to SprUrl() zawsze zwróci (o ile zwróci, bo w tym momencie jest to void) tą samą wartość.
Eldiane
Dzięki wszystkim za pomoc, jeżeli wystąpią jeszcze jakieś problemy to się zgłoszę =]

//Edit użyłem funkcji strpos, ponieważ przeczytałem że działa ona troszeczkę szybciej od strstr, zawsze lepiej nauczyć się dobrych nawyków, teraz wszystko (chyba) działa już poprawnie, chodź wskazówki byłyby mile widziane smile.gif

//Edit
Kolejna poprawka, nie chce robić nowych postów więc staram się wciskać wszystkie prace jakie dokonam w jednym temacie, dopóki nie zrobię tego dobrze. Teraz kolejne pytanie - jak nadać wartość zmiennym $przyciski public $przyciski_rek?

$Obiekt = new Strona();
$Obiekt->przyciski = array('Button1', 'Button2')
$Obiekt->przyciski_rek = array('Reklama1', 'Reklama2')

Nie daje pożądanego rezultatu, gdy napisze tak jak wyżej wartość zmiennej $tablica w funkcji URL jest wartością NULL thumbsdownsmileyanim.gif

A oto sam kod:

  1. class Strona(){
  2. public $przyciski = array('Button1', 'Button2');
  3. public $przyciski_rek = array('Reklama1', 'Reklama2');
  4.  
  5. private function URL($tablica)
  6. {
  7. for($i=0; count($tablica) > $i ; $i++)
  8. {
  9. ?>
  10. <tr>
  11. <td align="center">
  12. <?php
  13. $link_true = strpos($_SERVER['PHP_SELF'],$tablica[$i]);
  14. if(!($link_true === false))
  15. echo $tablica[$i];
  16. else
  17. echo "<a href=\"http://localhost/Tworzenie_strony_obiekty/".$tablica[$i].".php\">".$tablica[$i]."</a>";
  18. ?>
  19. </td>
  20. </tr>
  21. <?php
  22. }
  23. }
  24.  
  25. public function lewe_menu($przyciski)
  26. {
  27. ?>
  28. <table valign="top" border="1" width="100%">
  29. <?php
  30. $przyciski = $this->przyciski;
  31. $this->URL($przyciski);
  32. ?>
  33. </table>
  34. <?php
  35. }
  36.  
  37. public function prawe_menu($przyciski_rek)
  38. {
  39. ?>
  40. <table valign="top" border="1" width="100%">
  41. <?php
  42. $przyciski_rek = $this->przyciski_rek;
  43. $this->URL($przyciski_rek)
  44. ?>
  45. </table>
  46. <?php
  47. }
  48. }


Z góry dziękuje.
Eldiane
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.