Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: problem z klasą koszyk [rowziazane]
Forum PHP.pl > Forum > PHP > Object-oriented programming
liechmaster
Edytowanie2: Problem już rozwiązany, brakowało: else $koszyk = $_SESSION['koszyk'];

Edytowane: Warto dodać, że ten błąd występuje dopiero za drugim razem ( czyli pierwsza inicializacja jest ok.. ) dopiero jak strona jest przeładowana to się wywala.


Witam, mam nastepujący problem:

napisałem aplikację, która korzysta z klasy koszyk.
w środowisku testowym działa poprawnie (na php 5.x )
natomiast na serwerze na którym ma stać domyślnie ( serwer stoi na php 4.3.7) wywala się z błędem:

Fatal error: Call to a member function on a non-object in blabla/costam.php on line 75
w tej linijce jest coś takiego:
  1. <?php
  2. if (!isset($_SESSION['koszyk'])) {
  3. $koszyk = new Koszyk
  4. } 
  5. //nizej linijka 75
  6. $koszyk->wyswietl();
  7.  
  8. //jakis kod
  9. //i na koncu
  10. $_SESSION['koszyk']= $koszyk;
  11. ?>

natomiast definicja klasy to:

  1. <?php
  2. class Koszyk {
  3.  
  4. var $artykuly;
  5.  
  6.  function dodaj($numer, $ilosc) {//jakis kod }
  7.  
  8.  function wyswietl() {//jakis kod}
  9.  
  10. function usun() {//jakis kod}
  11.  
  12. }
  13. ?>


jaka może być przyczyna?
tomekp
Nie powinno być problemu, wydebuguj sobie czy przekazuje Ci $koszyk, bo z tego co widzę to nie, dojdź do tego w którym miejscu Ci gubi, conajmniej dziwne jest to, że działa to na php5.
Ace
Moze chodzi bardziej o session_start? Moze nie inicjalizujesz sesji i wtedy nie masz dostepu do danych sesyjnych. Jeden serwer moze miec autostart sesji w php.ini drugi nie.
php programmer
może zamiast
  1. <?php
  2. $koszyk = new Koszyk
  3. ?>


daj
  1. <?php
  2. $koszyk = new Koszyk();
  3. ?>


wogole dziwne że błędu składni tobie nie pokazło,
poza tym dlaczego klasa koszyk nie ma konstruktora?
batman
Problemem jest to, że nie tworzy Ci instancji klasy Koszyk. W Twoim przypadku zmienna $_SESSION['koszyk'] jest ustawiona i dlatego nie tworzy obiektu.
sf
@php programmer: można pisać new COS; i new COS(); poza tym od kiedy klasa musi miec zdefiniowany konstruktor? nie siej herezji tylko sprawdź tongue.gif
liechmaster
@Ace sesję ładuję na samym początku, nie wspominałem o tym bo wydawało mi się to oczywiste : ) (session_start() ).
najdziwniejsze jest to że to kurde działa mi na dwóch różnych serwerach (oba na php 5.x)
tylko wywalia się na tym 4.7.
w tej chwili nie mogę sprawdzić ale jak spojrzałem w phpinfo() to jest tam coś takiego jak dissable_classes i może właśnie na tamtym serverze jest to "on"?
póki co mam na wszelki wypadek niekoszerną wersję zastępczą na czystych funkcjach i tablicy $koszyk , która jest przekazywana przez referencję i na końcu zapisywana w sesji - tylko to nijak się ma do oop ; )

@sf o ile mi wiadomo to każdy tworzony obiekt wywołuje konstruktor klasy ; ) ( inna bajka czy jest on jawny czy też nie ;p)

tak mnie coś jeszcze tknęło.. żeby może jawnie odwołać się do zmiennej $koszyk, czyli dodać elsa w tym ifie:
  1. <?php
  2. if (!isset($_SESSION['koszyk'])) {
  3. $koszyk = new Koszyk
  4. } 
  5. else { $koszyk=$_SESSION['koszyk']; }
  6. //nizej linijka 75
  7. $koszyk->wyswietl();
  8.  
  9. //jakis kod
  10. //i na koncu
  11. $_SESSION['koszyk']= $koszyk;
  12. ?>
DeyV
pamiętaj o tym, że w przypadku register globals = off (zalecane ustawienie) $_SESSION['koszyk'] nie równa się $koszyk
liechmaster
no to jak korzystać z sesji dla register_globals= off?

i ewentualnie jak zapisać i odtworzyć obiekt z sesji?
bo nie bardzo rozumiem czemu $koszyk nie jest $_SESSION['koszyk'];
a raczej , czy nie mogę napisać $koszyk=$_SESSION['koszyk']?
sf
LOL tongue.gif Sprwadź po prostu czy w $_SESSION['koszyk'] jest na pewno ten obiekt, swoją drogą ja bym użył serialize gdyby wsadzał obiekt do sesji, ale może nie jest to konieczne... po prostu sprawdź co tam siedzi
Ace
  1. <?php
  2. echo print_r( $_SESSION['koszyk'] );
  3. ?>
liechmaster
problem rozwiązany,
tak jak pisałem, musiałem dodać elsa do tego ifa z koszyk$=$_SESSION['koszyk'] i wszystko już działa
faster
przed wystartowanie m sesji session_start() musisz załadować definicję klasy Koszyk aby manager sesji wiedział jak utworzyć instancję klasy Koszyk

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