Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Puste obiekty i sesja
Forum PHP.pl > Forum > PHP > Object-oriented programming
Edpl
Witam,
pisze koszyk internetowy na podstawie klasy podpatrzonej gdzies w necie (nie pamietam juz mozliwe cos zmienialem). Jednak mam problem z usuwaniem ostatnich elementow. Jesli np w koszyku zostaly 2 sztuki jakiegos produktu i chce sie je usunac... w tym momencie poprawnie wypisuje ze usunieto, koszyk nie wyswietla zawartosci, ale po przeladowaniu znowu te 2 sztuki sie pojawiaja (tak jakby zmiany nie byly wprowadzone do zmiennej sesyjnej). Probowalem wiec uzyc unset gdy obiekt jest pusty... ale cos niebardzo chce dzialac. Poradzcie cos. Zamieszczam skrypt:
  1. // fragment index.php:
  2. <? if (isset($_SESSION[cart])){
  3. $take=unserialize($_SESSION[cart]); }
  4. else
  5. {
  6. $take=new cart; 
  7.  }
  8.  if ($_GET[page]=='cart') { include('cart.php');}
  9. ?>
  10. //a tu cart.php
  11. <?
  12. function showall(cart $take){
  13. while ( list($ky,$vl) = each($take->goods)){
  14. $dbase=new database;
  15. $wynik=$dbase->search('id',$klucz); //od tego momentu $wynik jest obiektem. wlasciwosci wyciagniete z bazy danych na p
  16. dstawie id3
  17. $klucz=$wynik->name;
  18. echo "nazwa:$ky - ilosc:$vl<br>";
  19. unset($wynik);
  20. $_SESSION[cart]=serialize($take);
  21. if (empty($take)) {
  22. unset($_SESSION[cart]);
  23. unset($take); 
  24. }
  25. }
  26. }
  27.  
  28. switch ($_GET[action]) {
  29. case 'add':
  30. if(isset($_GET[id]) && isset($_GET[amount])){
  31. $take->add($_GET[id],$_GET[amount]);
  32.  
  33. echo "added<br><br>";
  34. showall($take);
  35. }
  36. else
  37. {
  38. echo "Error";
  39. }
  40. break;
  41. case 'del':
  42. if(isset($_GET[id]) && isset($_GET[amount])){
  43. $take->del($_GET[id],$_GET[amount]);
  44.  
  45. echo "deleted";
  46. showall($take);
  47. }
  48. else
  49. {
  50. echo "Error";
  51. }
  52. break;
  53. default:
  54. showall($take);
  55. break;
  56. }
  57.  
  58. ?>
  59. //klasa cart:
  60. <?
  61. class cart {
  62.  
  63. public $goods = array();
  64.  
  65. function add($id, $amount) {
  66. $this->goods[$id] += $amount;
  67. }
  68. function del($id, $amount) {
  69.  if ($this->goods[$id] > $amount) {
  70. $this->goods[$id] -= $amount;
  71. return true;
  72. } 
  73. elseif ($this->goods[$id] == $amount) {
  74. unset($this->goods[$id]);
  75. return true;
  76. } 
  77. else {
  78. return false;
  79. }
  80. }
  81. }
  82. ?>
php1983
Rzutem na taśmę to nie widać błędu, tylko powiedz co to jest cart w kontekście $_SESSION[cart], dlaczemu nie jest $_SESSION['cart']?

Pozatym sam nie wiem co się dzieje z unset()?

To cały skrypt, sprawdzony, można wkleić i sprawdzić debugiem. Może jest coś jak w C++, że istnieje
jakiś unreference operator. Jak dla mnie to $this w php5 to jakaś magia, albo kopia lustrzanego odpićia jakiegoś wskażnika do ref itd... W każdym razie, jak w swoim projekcie przeprowadze wewnętrzne testy w obiekcie i coś jest nie tak, to nie mogę go żadną siłą uśmiercić, tylko odradza mi się jako dummy. Co jest?
  1. <?php
  2. class terminator{
  3. function terminate($obj){
  4. unset($obj);
  5. }
  6. //przekazywanie przez ref. też ni zrobi nic zombiemu
  7. function terminate1(&$obj){
  8. unset($obj);
  9. }
  10. }
  11.  
  12. class A{
  13. function main(){
  14. $term=new terminator;
  15. $term->terminate($this);
  16. $term->terminate1($this);
  17. //jak to odkomentować to wogóle jest masakra
  18. //if(isset($this)) $this->main();
  19. }
  20. }
  21. $zombi=new A;
  22. $zombi->main();
  23. if(isset($zombi)){
  24. //sprawdź! zombi jest nie do zaj......
  25. $zombi->main();
  26.  
  27. }
  28. unset($zombi);
  29. if(!isset($zombi)){
  30. echo 'zombi zdechł';
  31.  
  32. }
  33. ?>
Edpl
;/ zwykle glupie wstawienie skryptu nie tam gdzie trzeba... blad o jedna klamre;] temat do wywalenia.
funkcja showall powinna wygladac tak:
  1. <?
  2. function showall(cart $take){
  3. while ( list($ky,$vl) = each($take->goods)){
  4. $dbase=new database;
  5. $wynik=$dbase->search('id',$klucz);
  6. $klucz=$wynik->name;
  7. echo "nazwa:$ky - ilosc:$vl<br>";
  8. unset($wynik);
  9. } // TU BYL BLAD...
  10. $_SESSION[cart]=serialize($take);
  11. if (empty($take)) {
  12.  unset($_SESSION[cart]);
  13.  unset($take);
  14. }
  15. } ?>


Nie ma jak to stracic pol dnia przez glupia klamre ;p Uroki bycia programista-amatorem ;p

@php1983: co do cart zamiast 'cart'... moze to nie calkiem poprawne ale oba zapisy daja to samo;]
mike
Cytat(Edpl @ 6.08.2008, 13:18:21 ) *
@php1983: co do cart zamiast 'cart'... moze to nie calkiem poprawne ale oba zapisy daja to samo;]
Bzdura!
Włącz sobie raportowanie i wyświetlanie błedów a zobaczysz tongue.gif Twój zapis jest niepoprawny.
Edpl
Mowie ze nie jest calkiem poprawny ;p ale jakby nie bylo... dziala ;p Poprawial tego typu bledy bede pozniej ;]
Sedziwoj
Cytat(Edpl @ 6.08.2008, 14:07:17 ) *
Mowie ze nie jest calkiem poprawny ;p ale jakby nie bylo... dziala ;p Poprawial tego typu bledy bede pozniej ;]


Tia, później będziesz szukał gdzie jest błąd przez który wszystko nie działa, nadal nie poprawisz tego, a to może być jego sprawka. Jak lubisz bałagan, to w nim siedź, ale innym nie mów że to jest ok.

@php1983
Jak nie wiesz jak działają referencje to Twój problem, usuwasz powiązanie nazwy zmiennej z danymi, nie znaczy że je usuwasz.

EDIT: to jakbyś w C usuwał wskaźnik, a nie zwalniał pamięć.
mike
Cytat(Edpl @ 6.08.2008, 14:07:17 ) *
Mowie ze nie jest calkiem poprawny ;p ale jakby nie bylo... dziala ;p Poprawial tego typu bledy bede pozniej ;]
To nie jest "niecałkiem poprawne". To jest całkiem źle.

Bez apostrofów:
1. przypadkowe, "poprawne" działanie
2. Generowanie błędów;
3. Opóźnianie skryptu, nawet do 30% przy częstym uzywaniu takiejgo czegoś.

Z apostrofami:
1. Działa dobrze

A tak w ogóle to po co robisz wcięcia w kodzie? Napisz skrypt i później dorób tongue.gif
Ja tu mówię o dobrych i popranwych nawykach a nie o "poprawianiu później".
Edpl
(ze skruszeniem) dobrze... poprawie sie ;p moze faktycznie to powinno byc nawykiem... a lenistwo nie najlepszym doradca ;p a wciecia... wtedy widze co gdzie mam poprawiac ^^
.radex
Cytat(Edpl @ 6.08.2008, 20:05:20 ) *
(ze skruszeniem) dobrze... poprawie sie ;p moze faktycznie to powinno byc nawykiem... a lenistwo nie najlepszym doradca ;p a wciecia... wtedy widze co gdzie mam poprawiac ^^


Na takie "głupoty" jak apostrofy, wcięcia czy na drobne bugi, które wydają się być naprawione trzeba zwracać dużą uwagę. Bo potem ten niby naprawiony bug się na tobie zemści, a nieczytelny błąd utrudni znalazienie tego buga.
Edpl
a co z zapisem typu echo "tekst: $jakas_zmienna"; ? tez powinienem sie ustrzegac?
Kicok
Cytat
a co z zapisem typu echo "tekst: $jakas_zmienna"; ? tez powinienem sie ustrzegac?


Jeśli zależy ci na wzroście wydajności rzędu 0,000001s to jak najbardziej. ;]
Pisz tak, jak ci wygodnie. Jedynym przeciwwskazaniem może być kolorowanie składni w twoim edytorze. Jeśli nie radzi sobie ze zmiennymi w cudzysłowie i przedstawia wszystko w jednym kolorze, to czytelniej będzie stosować:
  1. <?php
  2.  
  3. echo "Taki " . $zapis;
  4.  
  5. // zamiast:
  6.  
  7. echo "Takiego $zapisu";
  8.  
  9. ?>
php1983
Widze, że ten temat odbiegł na bok. Bardzo mi zależy żeby dowiedzieć się jak niszczyć obiekty. Jak pisałem na początku tematu, chyba drugi post, unset niedziała. Czy może mi ktoś pomóc?
Sedziwoj
Cytat(php1983 @ 7.08.2008, 12:53:18 ) *
Widze, że ten temat odbiegł na bok. Bardzo mi zależy żeby dowiedzieć się jak niszczyć obiekty. Jak pisałem na początku tematu, chyba drugi post, unset niedziała. Czy może mi ktoś pomóc?


A wiesz jak niszczyć obiekty w Java? dry.gif
php1983
Napisałbym sobie plugina do eclipse, ale PDE jest nawet spoko, pozatym nie znam Javy, chociarz, kiedyś w MSDNie, apropo ActiveX wyczytałem, że jawa ma GC. Jeśli jest coś podobnego w php to byloby miło. Pozatym pytanie, czy obiekt może się w kostruktorze unicestwić z użyciem tego php gc?
Sedziwoj
Cytat(php1983 @ 8.08.2008, 02:58:07 ) *
Jeśli jest coś podobnego w php to byloby miło. Pozatym pytanie, czy obiekt może się w kostruktorze unicestwić z użyciem tego php gc?

Wiesz jaka jest zasada GC, że nim nie kontrolujemy. Ale w PHP jest to proste, usuniesz wszystkie powiązania do obiektu, a zostanie usunięty z pamięci.

P.S. PHP jest w angielskojęzycznej wiki o Garbage collection, a w polskiej tylko Python i Ruby (z tych trzech) <myśli>
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.