Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> Zwracanie przez referencję
varez
post
Post #1





Grupa: Zarejestrowani
Postów: 275
Pomógł: 32
Dołączył: 17.06.2007

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


Witam,
potrzebuję, żeby moja statyczna metoda zwracała referencję do statycznego atrybutu, który jest tablicą, a konkretnie elementu tablicy, który znowu jest obiektem innej klasy. Obiekt ten chcę usunąć, wywołując destruktor. Tyle wstępu, teraz trochę kodu:

  1. <?php
  2. class wykobot {
  3. static private $channels=array();
  4.  
  5. static public function zmyslona_funckja() {
  6. self::$channels[] = array('name'=>'wtest', 'obj'=>new channel());
  7. }
  8. static public function &getChannelByName($name) {
  9. foreach (self::$channels as &$channel) {
  10. if ($channel['name']==$name) {
  11. return $channel['obj'];
  12. }
  13. }
  14. return false;
  15. }
  16. }
  17.  
  18. class channel {
  19. public function __destruct() {
  20. die('destruktor!');
  21. }
  22. }
  23.  
  24. wykobot::zmyslona_funckja();
  25. $ch = &wykobot::getChannelByName('wtest'); // element tablicy jest zwrócony, ale nie jako referencja
  26. unset($ch);
  27. die('koniec!')
  28. ?>


Niby obiekty zwracane są zawsze jako referencje, ale w wersji bez "&" też nie podziała, dlatego na próbę dopisałem.
Wiem też, że nie przeszadza to, że atrybut wykobot::$channels jest prywatny, ma tak działać.
Jeżeli w wykobot::getChannelByName przed returnem wstawimy unset($channel['obj']) to podziała jak trzeba, tj jedyny output jaki dostaniemy to "destruktor!".

Ten post edytował varez 9.01.2011, 10:51:11
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
Noidea
post
Post #2





Grupa: Zarejestrowani
Postów: 226
Pomógł: 61
Dołączył: 20.08.2010

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


Nie będziesz miał żadnej kopii. Obiekty w PHP5 przekazywane są przez referencje i nie potrzeba do tego żadnych &
  1. <pre>
  2. <?php
  3.  
  4. class A
  5. {
  6. private $arr = array();
  7.  
  8. public function __construct()
  9. {
  10. $this->arr['obj'] = new B();
  11. }
  12.  
  13. public function getObj()
  14. {
  15. return $this->arr['obj'];
  16. }
  17.  
  18. public function showObj()
  19. {
  20. echo $this->arr['obj']->var . "\n";
  21. }
  22. }
  23.  
  24. class B
  25. {
  26. public $var = 1;
  27. }
  28.  
  29.  
  30. $a = new A();
  31. $a->showObj();
  32.  
  33. $thisIsNotACopy = $a->getObj();
  34. $thisIsNotACopy->var = 5;
  35. unset( $thisIsNotACopy );
  36.  
  37. $a->showObj();
  38.  
  39. $thisIsCopy = clone $a->getObj();
  40. $thisIsCopy->var = 10;
  41. unset( $thisIsCopy );
  42.  
  43. $a->showObj();
  44.  
  45. ?>
  46. </pre>
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 15.10.2025 - 18:47