mysqli DB Klasse

Einklappen
X
 
  • Filter
  • Zeit
  • Anzeigen
Alles löschen
neue Beiträge

  • mysqli DB Klasse

    Hi,

    ich bin gerade dabei meine alte Datenbankklasse auf mysqli umzustellen. Aus Kompatibilitätsgründen müssen natürlich alle funktionen erhalten bleiben und auch im db-objekt ein paar Eigenschaften vorhanden sein.

    Die Klasse selbst stellt kein Problem dar, allerdings schaffe ich es nicht weitere Eigenschaften meiner Klasse hinzuzufügen. Ich hab das ganze mal herunter gebrochen:

    PHP-Code:
    class db extends mysqli {
        public 
    $foo 'bar';
        public function 
    __construct(){
            
    parent::__construct(DB_HOSTDB_USERDB_PASSDB_NAME);

            if(
    mysqli_connect_error()) {
                die(
    'Connect Error (' mysqli_connect_errno() . ') ' mysqli_connect_error());
            }
        }


    $db = new db();
    print_r($db);

    /*
    ergibt:

    db Object
    (
        [affected_rows] => 0
        [client_info] => 5.1.58
        [client_version] => 50158
        [connect_errno] => 0
        [connect_error] => 
        [errno] => 0
        [error] => 
        [field_count] => 0
        [host_info] => Localhost via UNIX socket
        [info] => 
        [insert_id] => 0
        [server_info] => 5.1.61-0ubuntu0.11.10.1
        [server_version] => 50161
        [sqlstate] => 00000
        [protocol_version] => 10
        [thread_id] => 6260
        [warning_count] => 0
    )*/ 
    Ich hätte jetzt erwartet die Eigenschaft "foo" beim print_r des frisch instanzierten Objekts zu sehen. Ähnlich wie hier:
    PHP-Code:
    class foo1 {
        public 
    $blub false;
    }    

    class 
    foo2 extends foo1 {
        public 
    $blah false;
    }

    $tmp = new foo2();
    print_r($tmp);

    /*
    ergibt:

    foo2 Object
    (
        [blah] => 
        [blub] => 
    )*/ 

    Warum kann ich bei mysqli keine Eigenschaften meinem Kindobjekt hinzufügen? Jemand eine Idee?

    Danke
    Zuletzt geändert von prego; 05.04.2012, 16:13.

  • #2
    Wenn du einen Adapter schreibst, dann sollte dieser nicht ableiten. Also dein "extends mysqli" ist hier falsch.

    Kommentar


    • #3
      Danke Hell,

      natürlich wäre es eine Möglichkeit das die DB-Klasse einfach nur ein Wrapper zu mysqli ist. Dann müsste ich aber alle Eigenschaften und Methoden von mysqli nachbilden. Es ist ja kein Adapter in diesem Sinne...

      Außerdem empfiehlt sogar php.net "extends" und kropff in seinem Tutorial genauso. Das ist kein wirklicher Grund aber mir scheint es logischer die Klasse zu erweitern und bestehendes zu nutzen als drum herum noch mal alles neu zu entwickeln...

      Oder meintest du das anders?

      Kommentar


      • #4
        Naja, es macht irgendwie von der Richtung her keinen Sinn. Mir, als jemand, der immer ein paar gedankliche Eselbrücken braucht, wurde beigebracht, dass man ein "extends" auch immer als ein "ist ein" übersetzen kann.

        In Deinem Fall würde es also lauten: DB ist ein MySQLi. Macht also sorum irgendwie nicht so viel Sinn wie MySQLi ist eine DB. Sorum gesehen müsste die $db Klasse alls grundlegenden Funktionen enthalten, die Du für alle Kindklassen benötigst. MySQLi erweitert diese Basis-Klasse dann um die MySQLi Methoden.

        Im Grunde genommen würde ich Dir empfehlen ein wenig mehr Arbeit in Kauf zu nehmen und komplett auf PDO umstellen. MySQLi kannst Du mit PDO genau so bedienen. Also warum das Rad nochmal neu erfinden?
        MM Newmedia | MeinBlog

        Kommentar


        • #5
          Ich danke euch für eure Anregungen... aber leider löst keine davon mein Problem.

          Warum kann ich bei Vererbung einer Klasse (mal völlig davon abgesehen das es sich um mysqli handelt) keine weitere Eigenschaft in der Kindklasse definieren?

          //edit:
          Beispiel "Object oriented style when extending mysqli class" von php.net
          http://de2.php.net/manual/en/mysqli.construct.php
          Zuletzt geändert von prego; 05.04.2012, 16:35.

          Kommentar


          • #6
            Zitat von prego Beitrag anzeigen
            natürlich wäre es eine Möglichkeit das die DB-Klasse einfach nur ein Wrapper zu mysqli ist. Dann müsste ich aber alle Eigenschaften und Methoden von mysqli nachbilden. Es ist ja kein Adapter in diesem Sinne...
            Sondern? Was gibts bei der mysqli-Klasse denn zu erweitern? Welche Methoden vermisst du?

            Wenn du mysqli kompatibel zu deiner Applikation machen willst, ist das ein Adapter und keine Erweiterung.

            Zitat von prego Beitrag anzeigen
            Außerdem empfiehlt sogar php.net "extends" und kropff in seinem Tutorial genauso. Das ist kein wirklicher Grund aber mir scheint es logischer die Klasse zu erweitern und bestehendes zu nutzen als drum herum noch mal alles neu zu entwickeln...
            Du erreichst eigentlich das Gegenteil. Ein Adapter ist wiederverwendbar. Wenn du allerdings deine Applikation gezielt auf mysqli anpasst, und dann irgendwann drauf kommst, dass du doch PDO benötigst, kannst du die komplette Applikation umkrempeln, anstatt einfach einen Adapter auszutauschen.

            Zitat von prego Beitrag anzeigen
            Warum kann ich bei Vererbung einer Klasse (mal völlig davon abgesehen das es sich um mysqli handelt) keine weitere Eigenschaft in der Kindklasse definieren?
            Kannst du doch eh. Funktioniert bei mir problemlos, auch mit mysqli. Verstehe nicht, was du hast.

            PHP-Code:
            class Foo extends mysqli {
                public 
            $bar 123;
            }

            $foo = new Foo('localhost''www''www''database');

            var_dump($foo->bar);
            // int(123) 
            Zuletzt geändert von h3ll; 05.04.2012, 16:41.

            Kommentar


            • #7
              Danke H3ll,

              wie ich gerade feststellen musste funktioniert es auch - allerdings wird es beim print_r nicht ausgegeben...

              PHP-Code:
                  $db = new db();
                  
                  echo 
              $db->foo// "bar"

                  
              print_r($db); //kein "foo" vorhanden 


              //edit:
              Genaugenommen ist es also ein Adapter, sehe ich ein. Also sollte ich wohl offensichtlich wirklich einen Wrapper schreiben. Meine Applikation nutzt sowieso nur vorgefertigte Methoden der DB-Klasse.
              Zuletzt geändert von prego; 05.04.2012, 16:48.

              Kommentar


              • #8
                Zitat von prego Beitrag anzeigen
                Außerdem empfiehlt sogar php.net "extends" und kropff in seinem Tutorial genauso.
                Korrektur. php.net und ich zeigen nur wie es funktioniert. Von Empfehlung steht da nichts.

                Peter

                PS. Nutze PDO, ist deutlich besser.
                Nukular, das Wort ist N-u-k-u-l-a-r (Homer Simpson)
                Meine Seite

                Kommentar

                Lädt...
                X