Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Statyczne zmienne w klasie w stecz, Poprzedni obiekt widzi "nową zmienną"
JohnySpot
post
Post #1





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Włocławek

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


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


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 4)
dr_bonzo
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


Uzyj statycznej zmiennek klasy:
static private $licznik;


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
JohnySpot
post
Post #3





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Włocławek

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


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ą.

Ten post edytował JohnySpot 23.06.2006, 18:50:46


--------------------
Go to the top of the page
+Quote Post
dr_bonzo
post
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


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 />


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
JohnySpot
post
Post #5





Grupa: Zarejestrowani
Postów: 106
Pomógł: 0
Dołączył: 9.09.2003
Skąd: Włocławek

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


Może ja coś skopałem :/ u mnie nie działało... chyba tongue.gif


--------------------
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 19.08.2025 - 16:14