Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Statyczne zmienne w klasie w stecz
Forum PHP.pl > Forum > PHP
JohnySpot
Chciałem dziś zrobić licznik obiektów pewnej klasy.
Zrobiłem wię klasę:
  1. <?php
  2. class test {
  3.  private $licznik;
  4.  
  5.  function __construct() {
  6.  $this->licznik++;
  7. echo 'Wywołano konstruktor. $licznik = '.$this->licznik;
  8.  }
  9.  
  10.  function __clone() {
  11. self::__construct();
  12.  }
  13.  
  14.  function show() {
  15. echo $licznik;
  16.  }
  17. }
  18.  
  19. $pierwsza = new test();
  20. $druga = clone $pierwsza;
  21. $pierwsza->show();
  22. ?>


Efekt był taki że pierwszy obiekt nadal widział jeden obiekt, drugi dwa. Rozumiem, że są to dwa odrębne obiekty i że podczas tworzenia drugiego z nich istniejąca wartość static ($licznik) została użyta do inicjalizacji zmiennej $licznik w obiekcie $drugi jednak czy dałoby się zrobić jakiś licznik "globalny", który działałby "wstecz" ?
dr_bonzo
Uzyj statycznej zmiennek klasy:
static private $licznik;
JohnySpot
Ojej. Tam w kodzie jest błąd, bo tam jest static. Już tak zrobiłem. Tylko, że static nie działa "wstecz". Zadziała dla nowego obiektu, ale nie zmieni stanu licznika poprzedniego. Wiem, że można próbować odwoływać się do zmiennej globalnej, ale to znowu powoduje krytyczny wzrost sprzężeń w kodzie. Chciałoby sie zrobić zmienną referencyjną, ale php Ci na to nie pozwala, a przekazywanie referencji do konstruktora też lipa, bo clone nie może wywołać konstruktora z referencją.
dr_bonzo
Cos bredzisz, wrzuc lepiej swoj kod (copy/paste, a nie przepisuj go).

Patrz na to:
  1. <?php
  2. class SomeClass
  3. {
  4. static private $counter = 0;
  5.  
  6. public function __construct()
  7. {
  8. self::$counter ++;
  9. }
  10.  
  11. public function getCounter()
  12. {
  13. return self::$counter;
  14. }
  15.  
  16. public function __clone()
  17. {
  18. print( "Cloning<br />n" );
  19. self::__construct();
  20. }
  21. }
  22.  
  23. function printCounter( $obj )
  24. {
  25. print( "Counter = " . $obj->getCounter() . "<br />n" );
  26. }
  27.  
  28. $a = new SomeClass();
  29. printCounter( $a );
  30.  
  31. $b = new SomeClass();
  32. printCounter( $b );
  33.  
  34. $c = new SomeClass();
  35. printCounter( $c );
  36.  
  37.  
  38.  
  39.  
  40. $cloned = clone $a;
  41. printCounter( $cloned );
  42.  
  43.  
  44. printCounter( $a );
  45. ?>

Wynik:
Kod
Counter = 1<br />
Counter = 2<br />
Counter = 3<br />
Cloning<br />
Counter = 4<br />
Counter = 4<br />
JohnySpot
Może ja coś skopałem :/ u mnie nie działało... chyba tongue.gif
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.