Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Dwie kopie obiektu ze wspolnym elementem
Bastion
post 24.02.2006, 17:46:28
Post #1





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

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


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 ?


--------------------
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 7)
mike
post 24.02.2006, 17:54:32
Post #2





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


Czyżby Ci chodziło o pole statyczne?
Static Keyword
Go to the top of the page
+Quote Post
Bastion
post 24.02.2006, 18:15:27
Post #3





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

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


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

Ten post edytował Bastion 24.02.2006, 18:19:16


--------------------
Go to the top of the page
+Quote Post
mike
post 24.02.2006, 18:57:43
Post #4





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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. ?>
Go to the top of the page
+Quote Post
Bastion
post 24.02.2006, 19:26:51
Post #5





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

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


@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


--------------------
Go to the top of the page
+Quote Post
mike
post 24.02.2006, 19:39:51
Post #6





Grupa: Przyjaciele php.pl
Postów: 7 494
Pomógł: 302
Dołączył: 31.03.2004

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


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
Go to the top of the page
+Quote Post
Bastion
post 24.02.2006, 19:45:53
Post #7





Grupa: Zarejestrowani
Postów: 505
Pomógł: 0
Dołączył: 8.01.2005

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


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

Ten post edytował Bastion 24.02.2006, 19:46:26


--------------------
Go to the top of the page
+Quote Post
Vengeance
post 24.02.2006, 20:29:51
Post #8





Grupa: Zarejestrowani
Postów: 657
Pomógł: 2
Dołączył: 15.08.2003
Skąd: Łódź

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


w dodatku zmieniając tablice w jednym z obiektów, zmienią się w wszystkich innych same.


--------------------
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 Wersja Lo-Fi Aktualny czas: 24.07.2025 - 21:44