[PHP] Problem z klasami i sesją

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:

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

Felerny kod metody:

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?

0

Może stara wersja PHP, jeszcze niezbyt OOPowa?

phpinfo();

0

Czy tam na pewno masz tablicę?

var_dump($_SESSION['Cart']);
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" }

0

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

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

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):

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

lepiej:

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:

error_reporting(0xFFFF);
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 ;)

0

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

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.

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.

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.

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ż,

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ę.

1 użytkowników online, w tym zalogowanych: 0, gości: 1