Du bist nicht eingeloggt! Möglicherweise kannst du deswegen nicht alles sehen.
  (Noch kein mods.de-Account? / Passwort vergessen?)
Zur Übersichtsseite
Hallo anonymer User.
Bitte logge dich ein
oder registriere dich!
 Moderiert von: Che Guevara


 Thema: Fehlersuche in PHP
erste ungelesene Seite | letzter Beitrag 
Meister Zopf

meister_zopf
etwas für sehr schlecht befinden
Ich hab ein PHP Script, in dem irgendwo ein Bug ist, den ich nicht finde. Da in PHP Remote debugging sehr mühsam oder gar nicht möglich ist, mach ich das halt so, in dem ich an bestimmten Stellen irgendwelche Variabeln dumpe, um zu sehen, was dort genau passiert.

Nun habe ich bemerkt, dass bei einer Klasse, von der eigentlich nur eine Instanz vorhanden sein sollte, am Ende des Scripts der Destruktor zweimal aufgerufen wird, der Konstruktor allerdings nur einmal.

Das lässt darauf schliessen, dass irgendwann im Script eine Kopie dieser Instanz erstellt wird. Allerdings kriege ich nicht raus wo! Ein "clone" wird im gesammten Script nirgends benutzt. Die __clone() Methode wird auch nie aufgerufen.

Wie krieg ich raus, wo im Script diese ungewollte Kopie erstellt wird?
25.01.2007 8:42:43  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
ausm bauch raus, würd ich das script von oben nach unten immer wieder beenden und schaun ob zu diesem Zeitpunkt schon 2 oder nur ein destruktor aufgerufen wird.

somit sollte sich eigentlich rausfinden lassen, an welcher stelle die kopie erstellt wird.
25.01.2007 10:51:38  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
OliOli

AUP Oli 21.12.2018
Erstell mal die gewollte instanz der klasse nicht. (also die zeile auskommentieren, und schau, wo der fehler auftritt, also wo er die instanz duplizieren will.

Nur so eine Idee...
25.01.2007 11:06:37  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Gute Idee! Gleich mal probieren.

€: Beide Ideen
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 11:12]
25.01.2007 11:11:44  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Cool, nun hab ichs irgendwie hingekriegt, dass der Destruktor dreimal aufgerufen wird. Ich denke es hat irgendwie mit einer Session Variabel zu tun.

Ich poste mal den Code der, wie ich meine, dafür verantwortlich ist:

 
PHP:
<?php
class LBX_Search
{
  private 
$SearchRequest;

  public function 
__construct()
  {  
    
$SearchRequest Session::getVar('LBX_SearchRequest');
    if (
$SearchRequest) {
      
$this->SearchRequest unserialize($SearchRequest);
      
$this->SearchRequest->dump();
    } else {
      
$this->SearchRequest = new LBX_SearchRequest;
    }
  }
    
  public function 
__destruct()
  {
    
$serializedSearchRequest serialize($this->SearchRequest);
    
Session::setVar('LBX_SearchRequest'$serializedSearchRequest);
  }

?>


Wenn ich gleich zu Beginn des Konstruktors exit() aufruf, dann kommt der Destruktor einmal. Wenn ich exit() am Schluss des Konstruktor aufrufem dann wird der Konstruktor mehrmals aufgerufen.
Die Klasse LBX_SearchRequest hat aber ihrerseite keine Instanz von LBX_Search. :|
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 11:24]
25.01.2007 11:17:49  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Also ich habs gefunden.

LBX_SearchRequest hat seinerseits Properties, welche auch wieder Properties haben, die nicht alle serialisiert werden sollen. Hab den Fehler nun beheben können, indem ich per __sleep() Methode die Properties bestimme, welche auch wirklich serialisiert werden sollen.

Danke für die Inputs
25.01.2007 11:39:54  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
irgendwie ... Singleton ?
25.01.2007 15:30:59  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
White[AoT]

Arctic
genau das habe ich mir auch gedacht
25.01.2007 17:58:47  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[Dicope]

[Dicope]
verschmitzt lachen
 
Zitat von White[AoT]

genau das habe ich mir auch gedacht

Watt? Wer bist du denn?
25.01.2007 18:22:12  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[DK]Peacemaker

[dk]peacemaker
Ich finde Singletons immer falsch
25.01.2007 18:26:39  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Singleton bringt herzlich wenig, wenn beim serialisieren dann eine Kopie davon angelegt wird, ne?

€:
 
Zitat von [DK]Peacemaker

Ich finde Singletons immer falsch



Warum das denn?
[Dieser Beitrag wurde 1 mal editiert; zum letzten Mal von Meister Zopf am 25.01.2007 18:42]
25.01.2007 18:42:28  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
[DK]Peacemaker

[dk]peacemaker
Es geht immer irgendwie anders
25.01.2007 18:46:35  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
FoxHunter

foxhunter2
Was ist das denn für eine sinnlose Aussage?
25.01.2007 18:51:31  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
unitrialer

Arctic
der hat MS, hör nich auf den!

ist Session was von dir oder hat php sone Schnittstelle?
25.01.2007 18:53:17  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
Meister Zopf

meister_zopf
Session ist was von mir. Session::setVar($var, $value) macht aber nix anderes als $_SESSION[$var] = $value;

Aber wie ich schon geschrieben habe, die Ursache für das Problem hab ich gefunden und behoben. peinlich/erstaunt
25.01.2007 19:02:59  Zum letzten Beitrag
[ zitieren ] [ pm ] [ diesen post melden ]
 Thema: Fehlersuche in PHP


mods.de - Forum » Webdesign & Coding » 

Hop to:  

Thread-Tags:
clone  debug  php 
| tech | impressum