mysqli DB Klasse

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • 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
    Last edited by prego; 05-04-2012, 15:13.

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

    Comment


    • #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?

      Comment


      • #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

        Comment


        • #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
          Last edited by prego; 05-04-2012, 15:35.

          Comment


          • #6
            Originally posted by prego View Post
            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.

            Originally posted by prego View Post
            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.

            Originally posted by prego View Post
            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) 
            Last edited by h3ll; 05-04-2012, 15:41.

            Comment


            • #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.
              Last edited by prego; 05-04-2012, 15:48.

              Comment


              • #8
                Originally posted by prego View Post
                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

                Comment

                Working...
                X