heinetz: PHP4!=PHP5

Hallo Forum,

vorab:objektorientiertes PHP ist mir leider immernoch fremd.

Nun stehe ich vor einer Aufgabe, ein fremdes Skript zu debuggen, dass mal mit PHP4 lief, nun aber mit PHP5 Probleme macht. Ich habe mich bis zu einem Punkt durchgekämpft, wo ein unterschiedliches Verhalten sichtbar wird.

Im Code wird relativ zum Anfang die Variable $add_field gefüllt.

#62 $add_field=new formular('tcr_tc_addfield','addfield');  
#63 $add_field->init_database($server, $db, $user, $passwort);  
#64 $add_field->set_dialogdatas($feldbezeichner_neu, $dialogelemente_addfield);  
#65 $add_field->inline_form();

Wenn ich das richtig deute, ist die Variable $add_field hinterher ein Objekt, und zwar eine Instanz der Klasse 'Formular'. Richtig?

Einige Zeilen später:

#85 $meinformular = new formular('tcr_tc_documents', 'doc');

… wird $meinformular als weitere Instanz der Klasse definiert und noch weiter unten steht…

#119 $meinformular->subformular['addfield']['neu']=$add_field;

… der Wert der Varaiblen $add_field wird einer Eigenschaft(?) von $meinformular zugewiesen.
Und genau da scheint das Problem zu sein! Denn später wird mit:

#127 $meinformular->subformular['addfield']['neu']->set_data_id("addfield[neu]");

… diese Eigenschaft manipuliert. Aber eben nicht, denn ausserdem hat sich $add_field verändert.
Ich deute das so, dass mit PHP5 in Zeile #119 nicht der Wert von $add_field in $meinformular->subformular['addfield']['neu'] geschrieben wird, sondern eine Referenz auf $add_field und damit in #127 das Original verändert wird … was zu dem Problem führt.

Deute ich das alles richtig und wenn ja,

wie lässt sich das umgehen?

danke und gruss,
heinetz

  1. Tach!

    Ich deute das so, dass mit PHP5 in Zeile #119 nicht der Wert von $add_field in $meinformular->subformular['addfield']['neu'] geschrieben wird, sondern eine Referenz auf $add_field und damit in #127 das Original verändert wird … was zu dem Problem führt.
    Deute ich das alles richtig und wenn ja,

    Ja, PHP5 arbeitet bei Objekten generell mit Referenzen, PHP4 hat in dem Fall eine Kopie übergeben.

    wie lässt sich das umgehen?

    Mit dem Operator clone.

    dedlfix.

    1. > Mit dem Operator clone.

      #119 $meinformular->subformular['addfield']['neu']=clone $add_field;

      jo, funktioniert. Wie weit geht das denn mit dem clonen?

      muss ich auch:

      $meinformular->methode(clone $add_field);

      gruss,
      heinetz

      1. Tach!

        Mit dem Operator clone.
        Wie weit geht das denn mit dem clonen?

        Das steht auf der verlinkten Handbuch-Seite vor dem ersten Kasten. Auch die deutsche Übersetzung ist nicht verkehrt.

        muss ich auch:
        $meinformular->methode(clone $add_field);

        Es gibt auch da keine Ausnahme von der Referenzübergaberegel.

        dedlfix.

        1. Tach!

          Mit dem Operator clone.
          Wie weit geht das denn mit dem clonen?

          Das steht auf der verlinkten Handbuch-Seite vor dem ersten Kasten. Auch die deutsche Übersetzung ist nicht verkehrt.

          muss ich auch:
          $meinformular->methode(clone $add_field);

          Es gibt auch da keine Ausnahme von der Referenzübergaberegel.

          dedlfix.

          Hilfe! Das bedeutet jede Variable, die irgendwo verwendet wird clonen, damit das läuft?

          gute nacht,
          heinetz

          1. Moin!

            Tach!

            Mit dem Operator clone.
            Wie weit geht das denn mit dem clonen?

            Das steht auf der verlinkten Handbuch-Seite vor dem ersten Kasten. Auch die deutsche Übersetzung ist nicht verkehrt.

            muss ich auch:
            $meinformular->methode(clone $add_field);

            Es gibt auch da keine Ausnahme von der Referenzübergaberegel.

            dedlfix.

            Hilfe! Das bedeutet jede Variable, die irgendwo verwendet wird clonen, damit das läuft?

            Nein, das wäre nicht zielführend. Das bedeutet ja im Endeffekt, dass du den gesamten Code durchforsten und umbauen musst. WENN du sowas tust, dann ändere es doch besser direkt in PHP5-objektorientierten Code, anstatt zu versuchen, die PHP4-Fehler anzupassen.

            - Sven Rautenberg

            1. Hilfe! Das bedeutet jede Variable, die irgendwo verwendet wird clonen, damit das läuft?

              Nein, das wäre nicht zielführend. Das bedeutet ja im Endeffekt, dass du den gesamten Code durchforsten und umbauen musst. WENN du sowas tust, dann ändere es doch besser direkt in PHP5-objektorientierten Code, anstatt zu versuchen, die PHP4-Fehler anzupassen.

              • Sven Rautenberg

              Genau den Eindruck habe ich auch. Nur dass ich hier nur ein kleines Budget zum Debuggen einer Anwendung, die vor 8 Jahren mal ein Praktikant mal hat und von der ich nicht mal genau weiss, was sie macht.

              gruss,
              heinetz

          2. Tach!

            Hilfe! Das bedeutet jede Variable, die irgendwo verwendet wird clonen, damit das läuft?

            Jein, alles was kein Objekt ist, wird ja immer noch und weiterhin kopiert.

            dedlfix.