Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Dwie kopie obiektu ze wspolnym elementem
Forum PHP.pl > Forum > PHP
Bastion
Mam takie drobne zapytanie, przypuscmy ze mam klase A i w jej sklad wchodzi klasa ktora jest rozszerzeniem. Czyli :

class A { ... } - glwona klasa
i
class B extends A { ....} - klasa zwierajace np dane, tablice etc



i teraz , tworze dwie kopie

kopia1 = new A;
kopia2 = new A;

czy da sie zrobic tak aby rozszerzenie klasy (klasaB) byla wspolna dla obu kopii ? tak ze modyfikacja jakiegos elementu w kopia1 nalezacego do rozszerzenia byla namacalna w drugiej kopii ?
mike
Czyżby Ci chodziło o pole statyczne?
Static Keyword
Bastion
niby tak, ale cos mi nie wyszlo

  1. <?php
  2.  
  3. class A
  4. {
  5. private static $arr = array();
  6.  
  7. public function foo($i)
  8. {
  9. return self::$arr[$i];
  10. }
  11. }
  12.  
  13. class B extends A
  14. {
  15. parent::$arr = array('bar0', 'bar1');
  16. }
  17.  
  18.  
  19. $kopia1 = new A;
  20. print $kopia1->foo(0);
  21. $kopia2 = new A;
  22. print $kopia1->foo(1);
  23.  
  24. ?>


Parse error: syntax error, unexpected T_STRING, expecting T_FUNCTION in /shine_home/html/modules/test/test.php on line 15

- gdyby ktos pytal co chce przez to osiagnac to chce miec dane jakby w oddzielnej klasie
tak aby nie powielaly sie one w kazdej kopii obiektu, czyli tak jakbym mial je poza klasa a w klasie global $arr, ale tak za bardzo nie chce miec
mike
No ale składania jest po to żeby ją stosować.
Nie możesz soebi jakiegos kodu ot tak do klasy wrzucić.

Może to Cię usatysfakcjonuje.
  1. <?php
  2.  
  3. class A
  4. {
  5. static public $arr = array();
  6.  
  7. public function foo($i)
  8. {
  9. return self::$arr[$i];
  10. }
  11. }
  12.  
  13. class B extends A
  14. {
  15. public function set( $arr = array( 'bar0', 'bar1' ) )
  16. {
  17. parent::$arr = $arr;
  18. }
  19.  
  20. }
  21.  
  22.  
  23. $kopia1 = new B;
  24. $kopia1->set();
  25. print $kopia1->foo(0);
  26. $kopia2 = new B;
  27. print $kopia2->foo(1);
  28.  
  29. ?>
Bastion
@mike, ale mam pytanie - bo moze brniemy zlym sladem bo zle sie wyrazilem, chodzi mi o to aby dane dajmy na to tablice 30kB nie byla powilana w kazdej kopii obiektu - czyli :
tworzac 30 kopii zeby w sumie nie zawieraly 900kB . Dochodze chyba do wniosku ze rozwiazaniem jest globalna tablica poza klasą sad.gif
mike
No to ja bym zrobił tak:
  1. <?php
  2.  
  3. class A
  4. {
  5. static public $arrTab = array( 1 => 'jeden', 2 => 'dwa', 3 => 'trzy' );
  6.  
  7. public function __construct()
  8. {
  9. }
  10.  
  11. public function getElement( $intIndex )
  12. {
  13. return self::$arrTab[ $intIndex ];
  14. }
  15.  
  16. public function setTable( $arrTab )
  17. {
  18. self::$arrTab = $arrTab;
  19. }
  20. }
  21.  
  22. class B extends A
  23. {
  24. public function __construct()
  25. {
  26. }
  27. }
  28.  
  29. $objOne = new B;
  30. print $objOne->getElement( 1 );
  31. $objTwo = new B;
  32. print $objTwo->getElement( 2 );
  33.  
  34. $objThree = new B;
  35. $objThree->setTable( array( 1 => 'cztery', 2 => 'pięć' ) );
  36. print $objThree->getElement( 1 );
  37. $objFour = new B;
  38. print $objFour->getElement( 2 );
  39.  
  40.  
  41. ?>


Nie tworzysz kopii tablicy, bo masz ją statyczną.
Możesz sobie pobierać elementy i jajk chcesz to możesz ją zamienić.

Nie wiem, o to chodzi?
Jak nie to chyba nie rozumiem sad.gif
Bastion
jesli $objOne $objTwo $objThree $objFour smile.gif korzystaja z jednej tablicy ktora zajmuje w pamieci tylko jeden swoj rozmiar a nie 4 smile.gif to o to mi biegalo tongue.gif
Vengeance
w dodatku zmieniając tablice w jednym z obiektów, zmienią się w wszystkich innych same.
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.