Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dostęp Do Zmiennych Obiektu Bez Inicjalizacji
Forum PHP.pl > Forum > PHP
Zodiac
Chciałbym mieć dostęp do zmiennych obiektu bez jego inicjalizacji.

Powiedzmy że mam klasę, która liczy pewne rzeczy i zwraca gotowe wyniki. Wywołuje ją raz w jednym miejscu i chciałbym mieć dostęp do tych wyników z każdego miejsca.

Znam dwie opcje: zmienna statyczna lub klasa Root (poniżej).

Czy są jakieś innne sposoby? Czy warto stosować zmienne statyczne?

  1. <?php
  2.  
  3.  
  4. class Root {
  5. var $obj1;
  6. var $obj2;
  7. //constructor
  8. function Root($value){
  9.  $this->obj1 = new Cos1($this)
  10.  $this->obj2 = new Cos2($this)
  11. }
  12. function draw()
  13. {
  14. cos1->Rysuj();
  15. };
  16. }
  17. class Cos2 {
  18. var $parent;
  19. //constructor
  20. function Cos2($value){
  21.  $this->parent = $value;
  22. }
  23. function rysunek(){
  24.  ....
  25.  return rysunek();
  26. }
  27. }
  28. class Cos1 {
  29. var $parent;
  30. //constructor
  31. function Cos1($value){
  32.  $this->parent = $value;
  33. }
  34. function Rysuj(){
  35.  $this->parent->obj2->rysunek();
  36. }
  37. }
  38.  
  39. root = new Root();
  40. root->draw();
  41.  
  42. ?>
M4chu
mozna stosowac tez zmienne globalne np
  1. <?php
  2. $obj1 = new Cos1;
  3. function funckja()
  4. {
  5. global $obj1;
  6. $obj1->metoda();
  7. }
  8. ?>

lub do klasy dolaczyc metode (przyklad z php4 smile.gif)
  1. <?php
  2. class Klasa
  3. {
  4. function &getInstance()
  5. {
  6. if(isset($GLOBALS['klasa']))
  7. {
  8.  return $GLOBALS['klasa'];
  9. }
  10. $GLOBALS['klasa'] =& new Klasa;
  11. return $GLOBALS['klasa']; 
  12. }
  13. }
  14. ?>
DeyV
nieestey - możliwości php4 są pod tym względem mocno ograniczone.
Problem pojawia się stąd, że nie można w tej wersji php odwoływać się do atrybutów singeltona, a właśnie to byłoby potrzebne w takim przypadku.

Mozna jednak skorzystać z metody, która zwróci np. referencję do nowo utworzonego obiektu, np.
  1. <?
  2. Root:: getCosTam();
  3. ?>

co pozwala na odwołanie się do tej klasy w dowolnym miejscu kodu

Natomiast w php 5 można zadeklarować atrybut jako static, i dzięki temu możliwe jest odwoływanie się do niego przy pomocy własnie singeltona.
Zodiac
M4chu -> nie zaskoczyłeś mnie, tak to jest sposób, ale globale sobie darowałem smile.gif

DeyV --> sorry że nie sprecyzowałem, chodzi o PHP5 a przykład akurat wyjąłem z PHP4 (i przy tym niedopracowany, bo tam o ile sie nie myle wypadało by dać referencje do obiektów, a nie ich kopie).


Czy w takim razie użycie dużej ilości zmiennych statycznych jest wskazane?

Czy też z zasady powinienem każdy obiekt inicjować (zazwyczaj robie to przez singletona, statyczna funckja + statyczna prywatna zmienna - obiekt )?


I btw - jak to sie ma do wydajności? Z natury statyczne zmienne nie mogą być wywoływane wewnątrz klasy przez $this, tylko self:: wiec matwi mnie czy aby na pewno jest to dobre podejście.


Dzięki za odpowiedzi.
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.