[PHP] Problem z klasami i sesją

[PHP] Problem z klasami i sesją
bieniomajster
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0

Witam,

od jakiegoś czasu pisze obiektowo w PHP. Do tej pory wszystko było ok... niestety piękne dni minęły i nastał czas chaosu.

Stworzyłem sobie klasę shoppingCart. Obecnie jest za długa żeby całą wklejać. W niej mam oczywiście kilka metod publicznych i prywatnych. Klasa nie ma żadnych zmiennych składowych.

Dane dotyczące koszyka gromadzę na zasadzie:
$_SESSION['Cart'][$ID] = $Count; gdzie: $ID - id produktu, $Count - ilość;

Błędy jakie mam występują jedynie na hostingu jaki posiadam. Lokalny serwer na kompie obsługuje mi wszystko normalnie.
Wszystkie błędy powiązane są z wykorzystaniem tablicy $_SESSION. Przykładowo:

Kopiuj
Fatal error: Cannot use object of type shoppingCart as array in xxx/shoppingCart.php on line 284

Felerny kod metody:

Kopiuj
public function AddToCart($ID,$Quantity=1){
	$_SESSION['Cart'][$ID] += $Quantity; // Linia w ktorej wystepuje blad
	if($_SESSION['Cart'][$ID] <= 0) $this->Delete($ID);
}

Wywołanie koszyka:
$Cart = new shoppingCart();
Ostatecznie, wywołanie metody jest następujące:
$Cart->AddToCart($ID,$Q); Gdzie obie dane są odpowiednimi danymi z GET'a.

Co może być nie tak? Ma ktoś jakiś pomysł? Czy może to być różniąca się konfiguracja PHP na obu serwerach?

edytowany 3x, ostatnio: bieniomajster
Demonical Monk
  • Rejestracja:ponad 17 lat
  • Ostatnio:12 miesięcy
0

Może stara wersja PHP, jeszcze niezbyt OOPowa?

phpinfo();


Women were the reason I became a monk - and, ah, the reason I switched back...
tomkiewicz
  • Rejestracja:około 23 lata
  • Ostatnio:prawie 3 lata
  • Postów:1193
0

Czy tam na pewno masz tablicę?

Kopiuj
var_dump($_SESSION['Cart']);

bieniomajster
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0

Potraktowałem tablice sesyjną poprzez print_r. Zauważyłem coś ciekawego.

Po dodaniu elementu do koszyka, widok z poza klasy:
Array ( [Cart] => Array ( [1] => 1 ) )
Natomiast widok z wnętrza metody zawartej w klasie:
Array ( [Cart] => shoppingCart Object ( ) )

Po odświeżeniu strony pierwszy widok jest następujący:
Array ( [Cart] => __PHP_Incomplete_Class Object ( [__PHP_Incomplete_Class_Name] => shoppingCart ) )

Zastanawiam się w tym momencie jak dokopać się do konkretnej tabeli... Pierwszy raz widzę coś takiego...
Nawet wujek Google nie ma nic ciekawego w swoim repo.

// Edit:
var_dump($_SESSION['Cart']);
object(__PHP_Incomplete_Class)#1 (1) { ["__PHP_Incomplete_Class_Name"]=> string(12) "shoppingCart" }

edytowany 1x, ostatnio: bieniomajster
tomkiewicz
  • Rejestracja:około 23 lata
  • Ostatnio:prawie 3 lata
  • Postów:1193
0

Gdzieś musisz robić przypisanie, albo podobnego babola. Wklej całość kodu na pastebin


bieniomajster
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0

http://wklej.org/id/412926/

Całość można sprawdzać pod:
http://mbienkowski.com/ns/

I proszę nie bijcie za kod, robię wszystko na szybko. Chciałbym jak najszybciej skończyć i dlatego całość leci po jakości :P

tomkiewicz
  • Rejestracja:około 23 lata
  • Ostatnio:prawie 3 lata
  • Postów:1193
0
bieniomajster napisał(a)

Po dodaniu elementu do koszyka, widok z poza klasy:
Array ( [Cart] => Array ( [1] => 1 ) )
Natomiast widok z wnętrza metody zawartej w klasie:
Array ( [Cart] => shoppingCart Object ( ) )

w których miejscach kodu robisz te dumpy/printy?

Tak na pierwszy rzut oka, to nigdzie nie inicjujesz elementu tablicy (to raczej nie to, ale może powodować kwiatki):

Kopiuj
$_SESSION['Cart'][$ID] = $_SESSION['Cart'][$ID] + $Quantity;

lepiej:

Kopiuj
if (array_key_exists($ID, $_SESSION['Cart']))
    $_SESSION['Cart'][$ID] += $Quantity;
else
    $_SESSION['Cart'][$ID] = $Quantity;

i koniecznie daj na samym początku kodu php:

Kopiuj
error_reporting(0xFFFF);

edytowany 1x, ostatnio: tomkiewicz
bieniomajster
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0

Inicjowanie nie ma tu akurat nic do rzeczy. Całość na localhoscie smiga... na komercyjnym serwerze już nie... Chyba napisze do serwisu. Niech się panowie męczą tymczasowo ;)

tomkiewicz
  • Rejestracja:około 23 lata
  • Ostatnio:prawie 3 lata
  • Postów:1193
0

Być może nie ma. Ale jeżeli kod sypie Ci warningami, to w którymś z kolei może być sedno problemu.


GD
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 14 lat
0

IMHO za dużo tego trzymasz w sesji. Jak już tak chcesz to cały obiekt shoppingCart w niej zapisuj lub najlepiej przejdź na bazę danych.

bieniomajster
  • Rejestracja:ponad 15 lat
  • Ostatnio:ponad 14 lat
0
GhostDog napisał(a)

IMHO za dużo tego trzymasz w sesji. Jak już tak chcesz to cały obiekt shoppingCart w niej zapisuj lub najlepiej przejdź na bazę danych.

Za dużo w sesji? Ile danych mogę wg Ciebie zapisać w $_SESSION?

Ekhm... Wcześniej zapisywałem dużo więcej danych.
Nie jest to problem związany z ilością danych tylko z dostępem do tablicy $_SESSION poprzez klasę.
Po usunięciu klasy i wrzuceniu wszystkiego na normalne funkcje wszystko działa jak należy. Jednak chciałbym dowiedzieć się co jest nie tak.

tomkiewicz
  • Rejestracja:około 23 lata
  • Ostatnio:prawie 3 lata
  • Postów:1193
0

Nie, to nie jest związane z ilością danych, których zresztą jest niewiele.

Sprawą nie miał się zająć serwis? Bo jeżeli chcesz jednak sam to naprawić, to dodaj ten error_reporting i popraw warningi. Bo inaczej to będzie wróżenie z fusów.


GD
  • Rejestracja:ponad 17 lat
  • Ostatnio:ponad 14 lat
0
bieniomajster napisał(a)

Za dużo w sesji? Ile danych mogę wg Ciebie zapisać w $_SESSION?

No jak dla mnie to możesz trzymać w sesji nawet całe złoto Fort Knox jeśli zdołasz.

Źle się wyraziłem z tą ilością, chodziło mi o to że w sesji lepiej IMHO trzymać tylko podstawowe dane, jak np id koszyka.

Wedle woli.

beniomajster napisał(a)

Ekhm... Wcześniej zapisywałem dużo więcej danych.

Co nie oznacza, że to przykładna praktyka. Wg mnie błąd, który dostajesz jest tego przyczyną, bo dla przyśpieszenie kodzenia poszedłeś na łatwiznę i oparłeś o sesję za dużo rzeczy.

Najlepiej odwołania do tablic globalnych trzymać w jednym miejscu, poprzez hermetyzację, w OOP PHP to mus.

No i jeszcze: '__PHP_Incomplete_Class Object' :| - im szybciej ten dziki język zniknie z powierzchni ziemi tym lepiej, ale to nie będzie szybko niestety. Btw to jest błąd w samym PHP raczej.

beniomajster napisał(a)

Nie jest to problem związany z ilością danych tylko z dostępem do tablicy $_SESSION poprzez klasę.
Po usunięciu klasy i wrzuceniu wszystkiego na normalne funkcje wszystko działa jak należy. Jednak chciałbym dowiedzieć się co jest nie tak

Jak już pisałem w teorii to nie jest ten problem, ale w php-owej praktyce wszystko możliwe.

Zrobiłeś z tej klasy quazi interfejs dostępu do sesji. Obiekt bez atrybutów to byt upośledzony.

Na przyszłość, zrób sobie pojedynczą klasę Session, najlepiej niech to będzie singleton i w nim opakuj $_SESSION

Korzystając z hermetyzacji i 'type hinting' OOP możesz zrobić coś takiego przecież,

Kopiuj
public function  put($key, array $data) {
   if (is_int($key) && ! array_key_exists($key, $this->_session) {
     //coś tam
   }
}

I już Ci się żaden pseudo obiekt nie wpierdzieli do sesji. Tzn to będzie istnieć dość wysokie prawdopodobieństwo, że się tak nie stanie, bo jak kiedyś otrzymałem błąd, o wiele mówiącej treści 'Something happen in line..,' to mnie już w PHP nic nie zdziwi.

W PHP koniecznie trzeba kodzić maksymalnie czysto i zgodnie z zasadami, żeby się o samo PHP nie sparzyć.

Wiem, że Ci się spieszy z projektem, ale jak mówią, gdzie się ktoś śpieszy to się diabeł cieszy:D (czy jakoś tak) więc lepiej jednak na początku sobie zrobić jakiś dobry zestaw klas narzędziowych (lub użyć framework'a),możesz np. zrobić klasę Request i w niej opakować resztę tablic globalnych i na takim fundamencie budować resztę.

edytowany 4x, ostatnio: GhostDog

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.