Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] tworzenie obiektu wewnątrz innej klasy
Forum PHP.pl > Forum > PHP
Merowing9
Mam dwie klasy

Pytanie

  1. <?php
  2. class Pytanie {
  3.  
  4. private $id;
  5. private $tresc;
  6. private $warianty = array();
  7. private $poprawne = array();
  8. private $przedmiot;
  9. private $autor;
  10. public $dobre=0;
  11. public $zle=0;
  12.  
  13. function __construct($id) {
  14.  
  15. connect_db();
  16. $sql = "SELECT id, tresc, warianty, poprawne, przedmiot, autor FROM pytania WHERE id = '$id'";
  17. $wynik = mysql_query($sql);
  18.  
  19. while($wartosc_z_bazy = mysql_fetch_array($wynik, MYSQL_ASSOC)) {
  20.  
  21. $this->id = $wartosc_z_bazy['id'];
  22. $this->tresc = $wartosc_z_bazy['tresc'];
  23. $this->warianty = explod($wartosc_z_bazy['warianty']);
  24. $this->poprawne = explod($wartosc_z_bazy['poprawne']);
  25. $this->przedmiot = $wartosc_z_bazy['przedmiot'];
  26. $this->autor = $wartosc_z_bazy['autor'];
  27.  
  28.  
  29. }
  30. }
  31.  
  32. function getId () {
  33. return $this->id;
  34. }
  35.  
  36. function setTresc ($parametr) {
  37. $this->tresc = $parametr;
  38. return 1;
  39.  
  40. }
  41.  
  42. function getTresc () {
  43. $this->tresc = convert_tex($this->tresc);
  44. return $this->tresc;
  45.  
  46. }
  47.  
  48. function setWarianty ($parametr) {
  49. foreach($parametr as $temp) {
  50. $i=0;
  51. $this->warianty[$i] = $temp;
  52. $i++;
  53. }
  54. return 1;
  55.  
  56. }
  57. function getWarianty () {
  58. $i=0;
  59. foreach($this->warianty as $res) {
  60. $this->warianty[$i] = convert_tex($res);
  61. $i++;
  62.  
  63. }
  64. }
  65.  
  66. function showWarianty () {
  67. $temp = "";
  68. $result = "";
  69. foreach($this->warianty as $temp) {
  70.  
  71. $result = ($result.'<br><input type="checkbox" name="'.$this->id.'[]" value="'.$temp.'" />'.$temp);
  72.  
  73.  
  74. }
  75. return $result;
  76. }
  77.  
  78.  
  79.  
  80.  
  81. function setPoprawne ($parametr) {
  82. foreach($parametr as $temp) {
  83. $i=0;
  84. $this->poprawne[$i] = $temp;
  85. $i++;
  86. }
  87. return 1;
  88.  
  89. }
  90. function getPoprawne () {
  91. $i=0;
  92. foreach($this->poprawne as $res) {
  93. $this->poprawne[$i] = convert_tex($res);
  94. $i++;
  95.  
  96. }
  97. }
  98.  
  99. function showPoprawne () {
  100. $temp = "";
  101. $result = "";
  102. foreach($this->poprawne as $temp) {
  103.  
  104. $result = ($result.'<br>'.$temp);
  105.  
  106.  
  107. }
  108. return $result;
  109. }
  110.  
  111. function setPrzedmiot ($parametr) {
  112. $this->przedmiot = $parametr;
  113. return 1;
  114.  
  115. }
  116.  
  117. function getPrzedmiot () {
  118. return $this->przedmiot;
  119. }
  120.  
  121. function setAutor ($parametr) {
  122. $this->autor = $parametr;
  123. return 1;
  124.  
  125. }
  126.  
  127. function getAutor () {
  128. return $this->autor;
  129. }
  130.  
  131. function modyfikuj($tresc, $warianty, $poprawne, $przedmiot, $autor) {
  132. $this->setTresc($tresc);
  133. $this->setWarianty($warianty);
  134. $this->setPoprawne($poprawne);
  135. $this->setPrzedmiot($przedmiot);
  136. $this->setAutor($autor);
  137. connect_db();
  138. $warianty = inplode($warianty);
  139. $poprawne = inplode($poprawne);
  140. $sql = "UPDATE `pytania` SET `tresc` = '$tresc', `warianty` = '$warianty', `poprawne` = '$poprawne', `przedmiot` = '$przedmiot', `autor` = '$autor' WHERE `pytania`.`id` = '$this->id';";
  141. mysql_query($sql);
  142. }
  143.  
  144. function sprawdz($zaznaczone) {
  145. foreach($this->poprawne as $temp1) {
  146. foreach($zaznaczone as $temp2) {
  147. if($temp1==$temp2) $this->dobre++;
  148. else $this->zle++;
  149.  
  150. }
  151. }
  152. }
  153. }
  154.  
  155.  
  156. ?>
  157.  


i Test
  1. <?php
  2.  
  3. class Test {
  4.  
  5. private $id;
  6. private $nazwa;
  7. private $przedmiot;
  8. private $czas;
  9. private $nr_pyt;
  10. private $pytania = array();
  11. private $status;
  12.  
  13. function getId () {
  14.  
  15. return $this->id;
  16. }
  17.  
  18. function setNazwa($parametr) {
  19. $this->przedmiot = $parametr;
  20. return 1;
  21.  
  22. }
  23.  
  24. function getNazwa () {
  25.  
  26. return $this->przedmiot;
  27. }
  28.  
  29.  
  30. function setPrzedmiot($parametr) {
  31. $this->przedmiot = $parametr;
  32. return 1;
  33.  
  34. }
  35.  
  36. function getPrzedmiot () {
  37.  
  38. return $this->przedmiot;
  39. }
  40.  
  41. function setCzas ($parametr) {
  42.  
  43. $this->czas = $parametr;
  44. return 1;
  45. }
  46.  
  47. function getCzas () {
  48.  
  49. return $this->czas;
  50. }
  51.  
  52. function setPytania ($parametr) {
  53. $i=0;
  54. foreach($parametr as $temp) {
  55. $this->pytania[$i] = $temp;
  56. }
  57. return 1;
  58.  
  59. }
  60.  
  61. function getPytania () {
  62.  
  63. }
  64.  
  65.  
  66. function setStatus ($parametr) {
  67. $this->status = $parametr;
  68. return 1;
  69.  
  70.  
  71. }
  72. function getStatus () {
  73. return $this->status;
  74. }
  75.  
  76. function __construct($id) {
  77.  
  78. connect_db();
  79. $sql = "SELECT id, przedmiot, czas, pytania, status FROM testy WHERE id = '$id'";
  80. $wynik = mysql_query($sql);
  81.  
  82. while($wartosc_z_bazy = mysql_fetch_array($wynik, MYSQL_ASSOC)) {
  83.  
  84. $this->id = $wartosc_z_bazy['id'];
  85. $this->przedmiot = $wartosc_z_bazy['przedmiot'];
  86. $this->czas = $wartosc_z_bazy['czas'];
  87. $this->nr_pyt = explod($wartosc_z_bazy['pytania']);
  88. $this->status = $wartosc_z_bazy['status'];
  89.  
  90.  
  91. }
  92. $i=0;
  93. foreach($this->nr_pyt as $temp) {
  94. $this->pytania[$i] = new Pytanie($temp);
  95.  
  96. $i++;
  97.  
  98. }
  99.  
  100.  
  101. }
  102.  
  103. function uruchom_test () {
  104. $this->setStatus(1);
  105. connect_db();
  106. $sql = "UPDATE `testy` SET `status` = '$this->status' WHERE `pytania`.`id` = '$this->id';";
  107. mysql_query($sql);
  108.  
  109. }
  110.  
  111. function wyswietl_test () {
  112. echo('<div class="test_title">'.$this->nazwa.'</div>');
  113. echo('<div class="time">'.$this->czas.'</div>');
  114.  
  115. $i=0;
  116. foreach($this->pytania as $temp) {
  117.  
  118. echo('<div class="test">
  119. <div class="podzial_gora"></div>
  120. <div class="tresc">'.$this->pytania[$i]->getTresc().'</div>
  121. <div class="warianty">'.$this->pytania[$i]->getWarianty().'</div>
  122. <div class="podzial_dol></div>"
  123. </div>');
  124.  
  125. $i++;
  126. }
  127.  
  128. }
  129. function zakoncz_test () {
  130. $i=0;
  131. foreach($this->pytania as $temp) {
  132. $this->pytania[$i]->sprawdz($_POST[$this->pytania->getId()]);
  133. $i++;
  134.  
  135. }
  136.  
  137. }
  138.  
  139.  
  140. function dezaktywuj_test () {
  141.  
  142. $this->setStatus(0);
  143. return 1;
  144.  
  145.  
  146. }
  147.  
  148. function wyswietl_wynik () {
  149.  
  150. echo ($this->pytania->dobre);
  151. echo ($this->pytania->zle);
  152.  
  153. }
  154.  
  155. function modyfikuj_test ($nazwa, $przedmiot, $czas, $pytania) {
  156. $this->setNazwa($nazwa);
  157. $this->setPytania($pytania);
  158. $this->setPrzedmiot($przedmiot);
  159. $this->setCzas($czas);
  160.  
  161. connect_db();
  162. $pytania = inplode($pytania);
  163. $sql = "UPDATE `testy` SET `nazwa` = '$nazwa', `pytania` = '$pytania', `czas` = '$czas', `przedmiot` = '$przedmiot' WHERE `testy`.`id` = '$this->id';";
  164. mysql_query($sql);
  165.  
  166. }
  167. }
  168. ?>
  169.  


Problem polega na tym że w konstruktorze klasy test tworze tablice obiektów typu pytanie i choćby przy próbie użycia metody wyswietl_test() wyskakuje błąd:

  1. Fatal error: Call to a member function getTresc() on a non-object in ....... on line 122


Co tu jest źle jak powinien wyglądać konstruktor aby obiekty zostały utworzone poprawnie
ixpack
Małe pytanie co to jest "explod i inplode" ? Skąd to jest?
Merowing9
sorki zapomniałem :
  1. function inplode ($parametr) {
  2. foreach($parametr as $temp) {
  3. $parametr = "$parametr#$temp";
  4.  
  5. }
  6.  
  7. $parametr = substr("$parametr", 6);
  8.  
  9. return $parametr;
  10.  
  11. }
  12.  
  13. function explod($parametr) {
  14.  
  15. $parametr = explode("#",$parametr);
  16.  
  17. return $parametr;
  18.  
  19. }
  20.  
  21. function convert_tex ($parametr) {
  22.  
  23. $parametr = str_replace('[tex]', '<img src ="https://chart.googleapis.com/chart?cht=tx&chl=', $parametr);
  24. $parametr = str_replace('[/tex]', '"/>', $parametr);
  25.  
  26. return $parametr;
  27.  
  28. }
cycofiasz
Sprawdź najpierw co jest w zmiennej $this->pytania[$i] za pomocą var_dump(), wstaw var_dump($this->pytania[$i]); w miejscu tego echo w metodzie wyswietl_test()
Merowing9
No wywaliło mi takie coś nie wiem jak to mogę zinterpretować wychodzi na to że obiekty są to w takim razie czemu mi to wywala ?



  1. string(2) "14" object(Pytanie)#3 (8) { ["id":"Pytanie":private]=> string(2) "11" ["tresc":"Pytanie":private]=> string(21) "Marian jest z babięt" ["warianty":"Pytanie":private]=> array(5) { [0]=> string(8) "pierwszy" [1]=> string(5) "drugi" [2]=> string(6) "trzeci" [3]=> string(7) "czwarty" [4]=> string(5) "piaty" } ["poprawne":"Pytanie":private]=> array(2) { [0]=> string(8) "pierwszy" [1]=> string(5) "drugi" } ["przedmiot":"Pytanie":private]=> string(7) "Algebra" ["autor":"Pytanie":private]=> string(2) "10" ["dobre"]=> int(0) ["zle"]=> int(0) } object(Pytanie)#4 (8) { ["id":"Pytanie":private]=> string(2) "12" ["tresc":"Pytanie":private]=> string(15) "Kolejne pytanie" ["warianty":"Pytanie":private]=> array(5) { [0]=> string(4) "piec" [1]=> string(5) "szesc" [2]=> string(6) "siedem" [3]=> string(5) "osiem" [4]=> string(8) "dziewiec" } ["poprawne":"Pytanie":private]=> array(2) { [0]=> string(4) "piec" [1]=> string(5) "szesc" } ["przedmiot":"Pytanie":private]=> string(5) "Matma" ["autor":"Pytanie":private]=> string(2) "20" ["dobre"]=> int(0) ["zle"]=> int(0) } object(Pytanie)#5 (8) { ["id":"Pytanie":private]=> string(2) "13" ["tresc":"Pytanie":private]=> string(15) "Kolejne pytanie" ["warianty":"Pytanie":private]=> array(5) { [0]=> string(4) "piec" [1]=> string(5) "szesc" [2]=> string(6) "siedem" [3]=> string(5) "osiem" [4]=> string(8) "dziewiec" } ["poprawne":"Pytanie":private]=> array(2) { [0]=> string(4) "piec" [1]=> string(5) "szesc" } ["przedmiot":"Pytanie":private]=> string(5) "Matma" ["autor":"Pytanie":private]=> string(2) "20" ["dobre"]=> int(0) ["zle"]=> int(0) } object(Pytanie)#6 (8) { ["id":"Pytanie":private]=> string(2) "14" ["tresc":"Pytanie":private]=> string(15) "czwarte pytanie" ["warianty":"Pytanie":private]=> array(5) { [0]=> string(6) "pietna" [1]=> string(6) "szesna" [2]=> string(8) "siedemna" [3]=> string(7) "osiemna" [4]=> string(10) "dziewietna" } ["poprawne":"Pytanie":private]=> array(2) { [0]=> string(6) "pietna" [1]=> string(6) "szesna" } ["przedmiot":"Pytanie":private]=> string(5) "Gegra" ["autor":"Pytanie":private]=> string(2) "40" ["dobre"]=> int(0) ["zle"]=> int(0) }
Noidea
Piszesz, że to są obiekty, a na początku tekstu który wkleiłeś widać
Kod
string(2) "14"

String w PHP obiektem nie jest, więc masz przyczynę błędu. Teraz musisz tylko dojść skąd się w tej tablicy wzięło "14". Zacznij od metody setPytania(), bo ma związek z tą właściwością, a jej kod wygląda... dziwnie.
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.