Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] czemu ta klasa nie działa
Forum PHP.pl > Forum > Przedszkole
kristoff
witam. Proszę o pomoc w wykryciu błędu w tej mojej prostej klasie. Zamiast działać poprawnie wyświetla mi się lista takich komunikatów:
Warning: fread(): supplied argument is not a valid stream resource

Otóż mam plik index.php który zawiera m.in taki fragment kodu:

  1. <?php
  2. include("klasa.php");
  3.  
  4. $angielski = new klasa ("data_en.txt", "random_en.php", 9920, "opis_en", "opis_en_id");
  5. $polski = new klasa ("data_pl.txt", "random_pl.php", 5493, "opis_pl", "opis_pl_id");
  6.  
  7. if($len=='en') {
  8. $angielski->proces();
  9. } else {
  10. $polski->proces();
  11. }
  12. ?>


oraz plik klasa.php którego zawartość to:

  1. <?php
  2. class klasa
  3. {
  4.  
  5. var $data;
  6. var $random;
  7. var $liczba_znakow;
  8. var $opis_len;
  9. var $id_len;
  10.  
  11. function proces () {
  12.  
  13. $fd=fopen("$this->data", "r");
  14. $old=fread($fd, 10);
  15. fclose($fd);
  16. $new=gmdate('d m Y');
  17.  
  18. if($old<>$new) {
  19. $numerek=rand(1, $this->liczba_znakow);
  20. $pobierz=mysql_query("select opis from $this->opis_len where $this->id_len ='$numerek'");
  21. $wiersz_2=mysql_fetch_row($pobierz);
  22. $fr=fopen("$this->random", "w");
  23. fwrite($fr, $wiersz_2[0]);
  24. $fd=fopen("$this->data", "w");
  25. fwrite($fd, $new);
  26. fclose($fd);
  27. $wiersz_2=$wiersz_2[0];
  28. }
  29. else {
  30. $fr=fopen("$this->random", "r");
  31. $wiersz_2=fread($fr, 4000);
  32. }
  33. }
  34. }
  35. ?>


To moja pierwsza klasa jaką utworzyłem no i coś nie działa. Proszę o pomoc
mike
Przy wywołaniu przekazujesz do konstruktora parametry.
Ale w definicji klasy nie ma żadnego konstruktora. Jak wyobrażasz sobei przekazywanie parametrów?
tiraeth
Konkretnie dodaj w klasie:
  1. <?php
  2. class klasa {
  3.  // ... var'y funkcji
  4.  
  5.  function klasa ( $data [, ... i tak dalej] )
  6.  {
  7. $this->data = $data;
  8. // ... itd.
  9.  }
  10.  
  11.  // ... reszta funkcji
  12. }
  13. ?>
kristoff
dzięki, rzeczywiście o to chodziło. Mam jeszcze jedno pytanko - a co jeśli chciałbym utworzyć jeszcze jeden obiekt który w przeciwieństwie do innych obiektów (które przekazywały pięć parametrów) nie przekazywałby trzeciego parametu? Z tego co zauważyłem to parametry z obiektu są przekazywane do konstruktora w takiej kolejności jak są podane w obiekcie

żeby zobrazować:

  1. <?php
  2. $polski = new klasa ("z1", "z2", z3, "z4", "z5");
  3.  
  4. function klasa ($z1,$z2,$z3,$z4,$z5) {
  5. $this->data=$z1;
  6. $this->random=$z2;
  7. $this->liczba_znakow=$z3;
  8. $this->opis_len=$z4;
  9. $this->id_len=$z5;
  10. }
  11. ?>


I jak teraz dodać obiekt który nie będzie miał trzeciej zmiennej? Jesli wyrzucę z3 to kolejność się zaburzy i konstruktor błędnie przypisze zmienną z4 i z5 (jako z3 i z4). Gdyby brakowało ostatniej zmiennej to nie byłoby problemu, nie wiem jedynie jak to zrobić gdy brakuje którejś ze środkowych zmiennych.
Denver
Można np. tak:
  1. <?php
  2. function klasa ($z1,$z2,$z3=null,$z4,$z5) {
  3. (...)
  4. if (!is_null ($z3))
  5. {
  6. $this -> liczba_znakow = $z3;
  7. }
  8. (...)
  9. }
  10. ?>

A przy tworzeniu obiektu jako trzeci argument wstawiamy NULL.
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.