Andi: Klasse verliert Werte

Hallo,

erstmal haben wir kein PHP5. Ich habe also meine Interfaces so geschrieben, dass sie in PHP4 funktionieren.
Folgender Code:

class cDB {
    function connect($server="",$user="",$passwd="") {
      $tmp = cDB::fLateChoose();
      $tmp->connect($server,$user,$passwd);
    }
    function fLateChoose($type="") {
      return createDB($type);
    } // end function fLateChoose

function errno() {
      $tmp = cDB::fLateChoose(); return $tmp->errno();
    }
}

function createDB($type) {
    static $objects = array();

if(!isset($objects[$type]))
      $objects[$type] = eval("return new cMySQL();");

return $objects[$type];
}

Hier wird eine Klasse erstellt und sie dann in tmp abgelegt.
Folgender Code:

class cMySQL extends cDB {
    function connect($server,$user,$passwd) {
      $this->Resource = mysql_connect($server,$user,$passwd) or die("Uschtl");
    }

function errno() {
      return mysql_errno($this->Resource);
    }
}

So wenn ich diese Beispiel dann folgendermaßen aufruf:

$cDB = new cDB();
$cDB->connect($host,$clogin,$cpassword);
$cDB->errno();

Bekomme ich die Fehlermeldung das Linkresource nicht stimmt. Also keine MySQL-Ressource ist.
Beim Debuggen ist mir aufgefallen, dass die Änderungen die ich in der Klasse cMySQL mache nicht in die Variable objects übernommen werden.

Kann mir jemand einen Rat geben :(

Grüße
Andi

  1. echo $begrüßung;

    Beim Debuggen ist mir aufgefallen, dass die Änderungen die ich in der Klasse cMySQL mache nicht in die Variable objects übernommen werden.
    Kann mir jemand einen Rat geben :(

    PHP4 arbeitet bei Zuweisungen steht mit Kopien. Und Kopien werden nicht mitgeändert, wenn sich das Original ändert und umgekehrt.

    Selbst bei einem

    $var = new myclass;

    wird in $var eine Kopie des erzeugten Objekts abgelegt, und das Original verworfen. Aber das nur nebenbei.

    Übrigens, so wie du das hier notiert hast, sehe ich keinen Grund für ein eval()

    $objects[$type] = eval("return new cMySQL();");

    Wenn du im richtigen Script hier noch einen variable Komponente mit einbringst, so rate ich dennoch von eval() ab und statt dessen zu ausformuliertem Code zu, z.B. mit if oder switch.

    echo "$verabschiedung $name";

    1. Hallo,

      PHP4 arbeitet bei Zuweisungen steht mit Kopien. Und Kopien werden nicht mitgeändert, wenn sich das Original ändert und umgekehrt.

      auch wenn ich ueberall die & davor setze bringt mir das wenig. Es funktioniert nicht.

      Gruss
      Andi

      1. Hallo Andi,

        warum verschwendest Du Deine Zeit mit PHP4.
        Nimm PHP5, alles darunter ist im Hinblick auf OOP nicht sinnvoll und nicht mehr zeitgemäß.

        Viele Grüße

        Stefan

        --
        bythewaythewebsuxgoofflineandenjoytheday
        1. Hallo Stefan,

          warum verschwendest Du Deine Zeit mit PHP4.
          Nimm PHP5, alles darunter ist im Hinblick auf OOP nicht sinnvoll und nicht mehr zeitgemäß.

          Tja wel unser Admin es nicht schafft unser System auf PHP5 umzustellen und der normale Betrieb leider weitergehen muss :(

          Gruß
          Andi

      2. echo $begrüßung;

        PHP4 arbeitet bei Zuweisungen steht mit Kopien. Und Kopien werden nicht mitgeändert, wenn sich das Original ändert und umgekehrt.
        auch wenn ich ueberall die & davor setze bringt mir das wenig. Es funktioniert nicht.

        Es hat doch keinen Zweck, wie wild mit & um sich zu werfen. Setze es mit Bedacht ein, kontrolliere seine Wirkung.

        Und vor allem: Entknote deinen Kode. Du rufst bunt durcheinander statische und dynamische Methoden von Objekten einer Klasse und einer erbenden Klasse und extra noch eine Standalone-Funktion auf.
        Der Aufruf geht sehr verschlungene Wege, ein eval() spielt auch noch mit, und bei jeder Zuweisung auf diesen Weg wird eine neue Kopie angelegt. Es wundert mich nicht, wenn dir da der Bezug zum Original-Objekt verloren geht. Wenigstens die Ressourcenkennung sollte erhalten bleiben, die kann man so oft kopieren, wie man will, die zeigt immer noch auf die gleiche Ressource.

        Bekomme ich die Fehlermeldung das Linkresource nicht stimmt. Also keine MySQL-Ressource ist.

        Hast du überhaupt mal nachgeschaut, ob der Verbindungsaufbau geklappt hat? Ich vermisse diesbezüglichen Code in deinem Posting. Was steht denn an der erwarteten Stelle wirklich drin? Vielleicht ein false, so wie es bei einem Fehler von mysql_connect() zurückgegeben wird?

        echo "$verabschiedung $name";

        1. Hallo,

          Es hat doch keinen Zweck, wie wild mit & um sich zu werfen. Setze es mit Bedacht ein, kontrolliere seine Wirkung.

          Und vor allem: Entknote deinen Kode. Du rufst bunt durcheinander statische und dynamische Methoden von Objekten einer Klasse und einer erbenden Klasse und extra noch eine Standalone-Funktion auf.
          Der Aufruf geht sehr verschlungene Wege, ein eval() spielt auch noch mit, und bei jeder Zuweisung auf diesen Weg wird eine neue Kopie angelegt. Es wundert mich nicht, wenn dir da der Bezug zum Original-Objekt verloren geht. Wenigstens die Ressourcenkennung sollte erhalten bleiben, die kann man so oft kopieren, wie man will, die zeigt immer noch auf die gleiche Ressource.

          So ein Knoten ist da gar nicht drin. Da mir in PHP4 leider keine Abstracten Klassen oder Interfaces zur Verfügung stehen bin muss ich mir selber so ein ding basteln. Den Fehler habe ich jetzt gefunden. Die Funktion createDB muss die Referenz zurück liefern. Weiters müssen dann alle Funktionen mit der Referenz aufgerufen werden ($tmp)

          Hast du überhaupt mal nachgeschaut, ob der Verbindungsaufbau geklappt hat? Ich vermisse diesbezüglichen Code in deinem Posting. Was steht denn an der erwarteten Stelle wirklich drin? Vielleicht ein false, so wie es bei einem Fehler von mysql_connect() zurückgegeben wird?

          Das ganze eval Zeugs und Fehlerkontrolle habe ich hier nicht herkopiert, das tut nichts zur Sache und würde nur unnötig ablenken. Vielleicht hätte ich auch nur eine Variable setzen sollen als ein connect zu machen.

          Dank und Gruß
          Andi