Malcolm Beck´s: Aus einer Funktion eine Klasse machen

مرحبا

ich hab hier ein kleines Menu-Script geschrieben, dass mit Daten aus der Datenbank Linklisten generiert. Die Daten sind ziemlich Flach gehalten und ohne Redundanzien.

Um nun aus den Paar Daten die Menu-Listen zu generieren, durchlaufe ich Rekursiv die Datenbank.
Jetzt würde ich diese Rekursive Funktion gerne in eine Klasse schreiben, nur weiss ich nicht, wie ich Sinnvoll eine Klasse programmieren soll.

Könnte mir jemand anhand meiner Funktion zeigen, wie er/sie diese Funktion in eine Klasse packen würde?

Installation: Einfach Host, Username, Passwort und Datenbank für die Verbindung anpassen und mittels htaccess alle aufrufe auf die index.php leiten, die restliche Installaion erfolgt dann vom Browser.

Script folgt sofort.

mfg

  1. مرحبا

    <?php /* 22.05.2012 */  
      
      $host = '';  
      $user = '';  
      $pass = '';  
      $db   = '';  
      
    /** .htaccess  
      RewriteEngine on  
      RewriteBase /  
      
      RewriteCond %{REQUEST_FILENAME} !-f  
      RewriteCond %{REQUEST_FILENAME} !-d  
      RewriteRule  .  /index.php [L,QSA]  
    */  
    /**  
     * Tabellenstruktur für Tabelle `apes_menu`  
     */  
    $drop = 'DROP TABLE IF EXISTS `apes_menu`';  
    $create = <<<EOT  
    CREATE TABLE IF NOT EXISTS `apes_menu` (  
      `itemId` int(8) NOT NULL AUTO_INCREMENT,  
      `parentId` int(8) DEFAULT "0",  
      `name` varchar(80),  
      `href` varchar(80),  
      PRIMARY KEY (`itemId`)  
    ) ENGINE=MyISAM CHARSET=utf8 COLLATE=utf8_unicode_ci;  
    EOT;  
      
    /**  
     * Daten für Tabelle `apes_menu`  
     */  
    
    ~~~~~~sql
      
    $insert = <<<EOT  
    INSERT INTO `apes_menu` (`itemId`, `parentId`, `name`, `href`) VALUES  
    (1, 0, 'Startseite', ''),  
    (2, 0, 'Computer', 'computer'),  
    (3, 2, 'Hardware', 'hardware'),  
    (4, 3, 'Mainboard', 'mainboard'),  
    (5, 3, 'Grakikkarte', 'grafikkarte'),  
    (6, 4, 'Ram', 'ram'),  
    (7, 2, 'Software', 'software'),  
    (8, 7, 'Freeware', 'freeware'),  
    (9, 7, 'Kostenpflichtig', 'kostenpflichtig'),  
    (10, 8, 'Bildbearbeitung', 'bildbearbeitung'),  
    (11, 8, 'Virenschutz', 'virenschutz'),  
    (12, 8, 'Musik bearbeiten', 'musik-bearbeiten'),  
    (13, 0, 'Privates', 'privates'),  
    (14, 13, 'Musik', 'musik'),  
    (15, 13, 'Bilder', 'bilder'),  
    (16, 13, 'Videos', 'Videos'),  
    (17, 16, 'Festival', 'festival'),  
    (18, 17, '1984', '1984'),  
    (19, 9, 'Bildbearbeitung', 'bildbearbeitung'),  
    (20, 9, 'Virenschutz', 'virenschutz'),  
    (21, 9, 'Musikverwaltung', 'musik-bearbeiten'),  
    (22, 4, 'Audio', 'audio'),  
    (23, 4, 'Ethernet', 'ethernet'),  
    (24, 11, 'Firewall', 'firewall');  
    EOT;  
    
    ~~~~~~php
      
      // Verbindung aufbauen  
      error_reporting(0); // Fehlermeldungen für Verbindungsaufbau unterbinden  
      
      $_connect = new mysqli ($host, $user, $pass, $db);  
      @$_connect->set_charset('utf8');  
      // Verbindung prüfen  
      if (mysqli_connect_errno())  
          exit (printf('<p>Verbindungsaufbau fehlgeschlagen: %s</p>', $_connect->connect_error));  
      
      error_reporting(E_ALL | E_STRICT);  // Fehlermeldungen wieder aktivieren  
      
      // Tabellen löschen und anlegen  
      if (isset($_GET['create-table'])) {  
        $_connect->query($create);  
        $_connect->query($insert);  
      }  
      if (isset($_GET['drop-table'])) {  
        $_connect->query($drop);  
      }  
      
      /**  
       *  $_SERVER['REQUEST_URI'] bearbeiten  
       *  
       *  Alles zwischen dem ersten relevanten Slash in der Adresszeile und  
       *  dem ersten Fragezeichen ausschneiden und in RequestPath speichern  
       *  
       *  $_GET['rpath'] wird mittels JQuery gesetzt und wird hier verwendet, damit  
       *  die Links im Ajax-Request korrekt "entlinkt" werden können (s. u.)  
       *  
       *  @example  
       *  http://example.com/foo/bar/baz?a=1;b=2  
       *  @return "/foo/bar/baz"  
       */  
      define('RequestPath', !empty($_GET['rpath']) ? urldecode($_GET['rpath']) : urldecode(implode('', array_slice(explode('?', $_SERVER['REQUEST_URI']), 0, 1))));  
      $_URL = explode('/', RequestPath); // RequestPath zerlegen  
      #print_r ($_URL);                  // {array(1 => 'foo', 2 => 'bar', 3 => 'baz')}  
      
      /**  
       *  
       * Das eigentliche Menu-Script  
       *  
       * Das Script liest Rekursiv alle Kinder eines Items aus, bis es keine Kinder mehr gibt.  
       *  
       * Parameter  
      
         @param $_parent   ItemId des Elternelements (Root ist immer 0)  
         @param $_idname   <ul id="$_idname"></ul> und in den inneren zweigen  <ul id="$_idname_$itemId"></ul>  
         @param $link      Mit diesem Parameter lassen sich Teilzweige kreieren,  
                           dazu übergibt man einfach den Pfad zum Elternzweig  
         @example  
      
         /example  
         /example/foo  
         /example/foo/bar  
         /example/foo/bar/baz  
      
         Um jetzt alle Kinder von "/example/foo" anzuzeigen, erwartet das Script einmal die ItemID von "/example/foo" als  
         Parameter "$_parent" und den URL-ausschnitt "/example/foo" als Parameter "$link".  
         Dann können alle Kinder von "/example/foo" korrekt angezeigt, und noch wichtiger, richtig verlinkt werden.  
         Nehmen wir an "/example/foo" hat die itemId "3", dann wäre der Korrekte Funktionsaufruf  
      
         MenuList (3, "sub-navigation", "/example/foo", true);  
      
         Ergebnis wäre in diesem Fall:  
      
         /example/foo/bar  
         /example/foo/bar/baz  
      
         @param $loop   Alle Kinder mit deren Kindern anzeigen, Ja oder Nein?!?  
         @return Valides HTML5  
       */  
      // Statement, dass Rekursiv aufgerufen wird  
      define('LikeParentId', 'SELECT  
                                        itemId, href, name  
                              FROM  
                                        apes_menu  
                              WHERE  
                                        parentId = %d  
                              ORDER BY  
                                        itemId');  
      
      function MenuList ($_parent, $_idname, $link=false, $loop=false)  
      {  
              global $_connect, $_URL;  
              $add = $link ? $link : '' ;   # Eltern-Link, falls übergeben wird  
              $li = false;                  # HTML-Liste  
              if ($m = $_connect->query(sprintf(LikeParentId, $_connect->real_escape_string($_parent))))  
                  while ($f = $m->fetch_assoc())  
                  {  
                      $link = $add . '/' . urlencode($f['href']);                            # Link mit etwaigen Eltern  
                      $tree = (strpos('/'.$_URL[1], $link) !== false OR $loop) ? 0 : 1;      # Kinder anzeigen?!?  
                      $tmpl = RequestPath != urldecode($link)                                # Aktive Seite "entlinken"  
                            ? '<a data-itemid="%2$d" href="%3$s"%4$s>%1$s</a>'               # Link zur Seite  
                            : '<span data-itemid="%2$d" data-href="%3$s"%4$s>%1$s</span>' ;  # Aktive Seite ohne Link  
                      $li .= sprintf("\n" . '<li%5$s>' . "$tmpl" . '%6$s</li>'               # Liste zusammenbauen  
                             /* 1 */ , $f['name']  
                             /* 2 */ , $f['itemId']  
                             /* 3 */ , $link  
                             /* 4 */ , MenuList ($f['itemId'], 'test') ? ' class="got_childs"' : ''  
                             /* 5 */ , (strpos(RequestPath, urldecode($link)) === 0 AND $link != '/') ? ' class="active_tree"' : ''  
                             /* 6 */ , !$tree ? MenuList ($f['itemId'], "{$_idname}_{$f['itemId']}", $link, 1) : ''  
                            );  
                  }  
              else    # Wenn nichts gefunden wird  
                  return false; # return '<p>Keine Daten gefunden</p>';  
              # Andernfalls Liste zurückgeben  
              if ($li)  
                  return sprintf('<!-- %1$s starts --><ul id="%1$s">%2$s</ul><!-- %1$s ends -->', $_idname, $li);  
      }  
      /**  
       * Menu-Script ends  
       */  
      
      /**  
       * Das folgende ist ein bisschen Tricky.  
       * JQuery ruft dieses Script (index.php) mit 3 Parametern auf (?itemid=INT;rpath=STRING;linkto=STRING).  
       * Wenn diese Seite nun angefordert wird, dann gibt das Script das über  
       * die Parameter selektierte Menu zurück und beendet die weitere Ausführung, damit im JQuery-Request  
       * nur das gewünschte Menu drin steht, nicht die Komplette Ausgabe dieses Scriptes.  
       * Das ist eine Quick&Dirty-Lösung zur veranschaulichung, was sich mit dem Menuscript so anstellen lässt.  
       */  
      if (!empty($_GET['itemid']) AND !empty($_GET['linkto'])) {  
          if (MenuList ($_GET['itemid'], 'test'))  
              return printf ('<div id="ajax_request">%1$s</div>'  
                            , MenuList ($_GET['itemid'], 'callback-navigation', urldecode($_GET['linkto']), true));  
          else  
              return; // die weitere Ausgabe verhindern  
      } //  
    
    

    Ausgabe folgt.

    mfg

    1. مرحبا

      Ausgabe (das ist alles, insgesamt um die 400 Zeilen)

        /**  
       * Ausgabe  
       */  
        print <<<EOT  
      <!DOCTYPE html>  
      <html>  
      <head>  
      <meta charset="utf-8">  
      <title>APES - Awesome Path Enumeration Script</title>  
      <style>  
      
      ~~~~~~css
      body {  
        padding:0 10px 40px;  
        color:#666;  
        font: .9em/150% Geneva,Helvetica,sans-serif,Verdana;  
        letter-spacing:1px;  
      }  
      h1, h2, h3, h4, h5, h6 {  
        margin-top:30px;  
        font-size:1.3em;  
      }  
      h2, h3 {  
        margin-top:100px;  
      }  
      ul {  
        margin-left:25px;  
        padding:0;  
      }  
      li span { /* in diesem Fall der Aktive "Link" */  
        color:#F00;  
      }  
      a {  
        color:#336699;  
      }  
      a:focus, a:hover, a:active {  
        color:#DD4B39;  
      }  
      abbr {  
        border:0 none;  
      }  
      .got_childs:after {  
        content:' »';  
        color:#b0c4de;  
      }  
      #navigation {  
        width:14em;  
      }  
      #navigation li:hover {  
        position:relative;  
        z-index:1;  
      }  
      .got_childs:hover:after,  
      #navigation li:hover > .got_childs:after {  
        color:#F00;  
      }  
      #navigation li:hover #ajax_request {  
        display:block;  
      }  
      #ajax_request {  
        display:none;  
        padding:20px 15px 15px 5px;  
        position:absolute;  
        z-index:10;  
        left:9em;  
        top:-20px;  
        border:2px solid #999;  
        min-width:300px;  
        min-height:200px;  
        border-radius:10px;  
        box-shadow:5px 5px 5px #AAA;  
        background: #FFF;  
      }  
      #ajax_request a {  
        display:block;  
      }  
      li.active_tree > a,  
      li.active_tree > a.got_childs:after {  
        color:#6495ed;  
        text-decoration:none;  
      }  
      li.active_tree > a.got_childs:after {  
        color:#3CF;  
      }  
      .active_tree a:hover,  
      .active_tree a:hover:after {  
        color:#F00 !important;  
      }  
      #footer {  
        margin:40px 0 0;  
        padding:10px 0 0;  
        border-top:1px solid #8BA5BF;  
      }  
      #footer li {  
        margin-right:5px;  
        font-size:.95em;  
        list-style:none;  
        display:inline;  
      }  
      header {  
        margin:-8px -17px;  
        padding:0;  
        background: #cedce7; /* Old browsers */  /* http://www.colorzilla.com/gradient-editor/ */  
        background: -moz-linear-gradient(top,  #cedce7 0%, #ffffff 100%); /* FF3.6+ */  
        background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,#cedce7), color-stop(100%,#ffffff)); /* Chrome,Safari4+ */  
        background: -webkit-linear-gradient(top,  #cedce7 0%,#ffffff 100%); /* Chrome10+,Safari5.1+ */  
        background: -o-linear-gradient(top,  #cedce7 0%,#ffffff 100%); /* Opera 11.10+ */  
        background: -ms-linear-gradient(top,  #cedce7 0%,#ffffff 100%); /* IE10+ */  
        background: linear-gradient(top,  #cedce7 0%,#ffffff 100%); /* W3C */  
        filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#cedce7', endColorstr='#ffffff',GradientType=0 ); /* IE6-9 */  
      }  
      pre {  
        margin:0;  
        padding:0 10px 15px;  
        font-weight:bold;  
        font-size:1.1em;  
        line-height:140%;  
        white-space:pre;  
      }  
      pre a {  
        text-decoration:none;  
        display:inline-block;  
      }  
      pre span {  
        font-size:1.2em;  
        letter-spacing:2px;  
      }
      
      </style>  
      </head>  
      <body>  
      <header><pre><a href="/">  
             _____ _____________________ _________  
            /  _  \\______   \_   _____//   _____/  
           /  /_\  \|     ___/|    __)_ \_____  \  
          /    |    \    |    |        \/        \  
          \____|__  /____|   /_______  /_______  /  
                  \/                 \/        \/  
           <span>Awesome Path Enumeration Script</span></a></pre>  
      </header>  
      EOT;  
        
        if (MenuList (0, 'test')) // Wenn es Menus gibt  
        {  
            // Menu  
            print '<h1>Navigation</h1>';  
            print MenuList (0, 'navigation');  
            // Teilzweig  
            print '<h2>Teilzweig mit allen Kindern von <a href="/computer/software">Software</a></h2>';  
            print MenuList (7, 'software', '/computer/software', true);  
            // Ausgeklapptes Menu  
            print '<h3>Ausgeklapptes Menu</h3>';  
            print MenuList (0, 'navigation-expanded', false, true);  
        }  
        else {  
            printf ('<p>Keine Daten gefunden.</p><p>Jetzt welche erstellen: <a href="?create-table=true">Create Table</a></p><pre style="margin:40px 0 50px;">%s</pre>', htmlspecialchars($create, ENT_QUOTES));  
        }  
        // Für JQuery den RequestPath in einer Variable speichern  
        $JQRP = sprintf ('var RequestPath = "%1$s";', urlencode(RequestPath));  
        
        print <<<EOT  
      <ul id="footer">  
      <li><a href="?create-table=true">Create Table</a></li>  
      <li><a href="?drop-table=true">Drop Table</a></li>  
      </ul>  
      <!-- Und noch ein bisschen Voodoo -->  
      <script type="text/javascript" src="http://code.jquery.com/jquery-1.7.2.min.js"></script>  
      <script type="text/javascript">  
      $(function() {  
          $JQRP  
          $("#navigation a,#navigation span").hover(  
            function () { // On  
              var itemId = $(this).data('itemid');  
              var mhref  = $(this).attr('href') ? $(this).attr('href') : $(this).data('href');  
              $('#ajax_sub_tree').remove();  
              $(this).after('<div id="ajax_sub_tree"></div>');  //  
              $('#ajax_sub_tree').load('/?rpath='+RequestPath+';itemid='+itemId+';linkto='+mhref, function() {  
                  $(this).hide().fadeIn(250);  
              });  
            }, // On ends  
            function () { // Off  
                $(this).animate({opacity:1},0,"",  
                     function(){  
                          $("#ajax_sub_tree").hover(  
                              function () {}, // Keine Ahnung, wie es ohne diesen Sinnlosen Funktionsaufruf funktioniert  
                              function () {  
                                $('#ajax_sub_tree').fadeOut(0);  
                              }  
                          );  
                      })  
            } // Off ends  
          );  
      });  
      </script>  
      </body>  
      </html>  
      EOT;
      

      mfg

      1. Lieber Malcolm Beck´s,

        |                     $("#ajax_sub_tree").hover(  
        
        >                         function () {}, // Keine Ahnung, wie es ohne diesen Sinnlosen Funktionsaufruf funktioniert  
        >                         function () {  
        >                           $('#ajax_sub_tree').fadeOut(0);  
        >                         }  
        >                     );
        
        

        vielleicht so?

        $("#ajax_sub_tree").hover(  
            null,  
            function () {  
                $('#ajax_sub_tree').fadeOut(0);  
            }  
        );
        

        Die hover-Metode solle schon prüfen, ob der übergebene Parameter "überhaupt befüllt" ist.

        Liebe Grüße,

        Felix Riesterer.

        --
        ie:% br:> fl:| va:) ls:[ fo:) rl:| n4:? de:> ss:| ch:? js:) mo:} zu:)
        1. مرحبا

          // Keine Ahnung, wie es ohne diesen Sinnlosen Funktionsaufruf funktioniert

          vielleicht so?

          $("#ajax_sub_tree").hover(

          null,
              function () {
                  $('#ajax_sub_tree').fadeOut(0);
              }
          );

            
          Ja, genau so, Danke. Das Javascript-gefrickel wollte ich nach der Klasse angehen, aber das wird wohl nichts mehr.  
            
          
          > Die hover-Metode solle schon prüfen, ob der übergebene Parameter "überhaupt befüllt" ist.  
            
          Ich hab noch so meine schwierigkeiten mit JQuery und hover.  
          Ich wollte es einfach nur zum laufen kriegen, um es dann hier zu verbessern, aber dass lasse ich auch jetzt wie es ist.  
            
          mfg
          
          -- 
          [Never look back ...](http://www.youtube.com/watch?v=KHUSENUtn7k)
          
    2. Hallo,

      Urgh, nicht böse gemeint aber dein Code sieht schrecklich aus!

      Das ganze müsste man in viele verschiedene Teile und Dateien aufteilen.

      1. Das SQL für CREATE und INSERT sollte in eigene SQL dateien also database_schema.sql und data.sql oder so.

      2. Du bräuchtest eine Abstraktionsklasse für deine Datenbank die z.b. die credentials im construktor übernimmt und da vielleicht gleich ne connection aufbaut und ne Methode hat dein Query ausführt und ein Assoziatives Array mit den Daten und/oder ein Error-Objekt (mit Infos über den Fehler) zurückgibt.

      3. Du bräuchtest eine Menue-Klasse die eine Methode hat die die Daten aus der Datenbank holt und als assoziatives Array in einer Instanzvariable abspeichert.

      4. Du bräuchtest eine Template-Datei die auf diese Instanzvariable zugriff hat und aus dem Assoziativen Array dann HTML bastelt.

      6. Du bräuchtest ein Dispatcher-Script was die HTTP-Anfrage (evtl. gleich mal  REST angucken) entgegen nimmt und den richtigen Controller mit der richtigen Methode aufruft.

      5. Du bräuchtest eine Controller-Klasse die auf Anfragen wie Create, Read, Update, Delete (CRUD) reagieren kann und die Menue-Klasse dazu benutzt dem Template die Daten zur Verfügung zu stellen.

      Grundsätzlich solltest du dir mal MVC (Model, View, Controller) angucken, die Menue Klasse wäre dein Model, das Template dein View und die Controller-Klasse dein Controller. Da kannst du dann anfangen Code wiederzubenutzen.

      Die Datenbankklasse kannst du z.B. schon mal in allen Models benutzen um daten zu holen und zu speichern (Vielleicht sogar als Singleton), evtl gibt es in allen Models gemeinsamkeiten die man in einer Elternklasse von diesen reinschreiben kann um sich nicht wiederholen zu müssen, das gleiche Gilt für den Controller.

      Ich würde sogar empfehlen von PHP wegzugehen und sich mal Ruby on Rails anzuschauen. Das hat schon von vorn hinein eine sehr gute MVC-Struktur von der man wirklich sehr viel lernt, Ruby ist eine viel schönere OOP-Sprache die die ganzen Fallstricke nicht hat die PHP hat und das ganze SQL wird einem da für den Anfang auch von ActiveRecord abgenommen. Du musst es dann nicht wirklich benutzen aber du würdest ein viel besserer Programmierer werden und würdest OOP verinnerlichen wenn du dich mal mit dem Web-Framework Ruby on Rails beschäftigen würdest.

      Jeena

  2. hi,

    Installation: Einfach Host, Username, Passwort und Datenbank für die Verbindung anpassen und mittels htaccess alle aufrufe auf die index.php leiten, die restliche Installaion erfolgt dann vom Browser.

    Warum die Serverkonfiguration bemühen? Lege Deine Klasse in eine Datei und diese kann per require in jede andere php-Datei eingebunden werden. Hilfreich dazu ist auch ini_set('include_path', ...);

    Zur Organisation in Klassen könnte ich Dir nur Vorschläge machen. Einer davon: Erstelle eine Basisklasse für DB-Zugriffe. Abgeleitet davon jeweils Subklassen für die speziellen Aufgabenstellungen. In den Subklassen stehen alle notwendigen SQL-Statements, organisiert in Methoden. In der PHP-Datei, welche die Response liefert, stehen keine SQL-Statements, da werden nur noch Methoden aufgerufen, nach vorheriger Objekterstellung.

    Das hat sich in meiner Praxis in Perl bewährt und mittlerweile auch in PHP ;)

    Hotti

    1. Hallo,

      Zur Organisation in Klassen könnte ich Dir nur Vorschläge machen. Einer davon: Erstelle eine Basisklasse für DB-Zugriffe. Abgeleitet davon jeweils Subklassen für die speziellen Aufgabenstellungen. In den Subklassen stehen alle notwendigen SQL-Statements, organisiert in Methoden. In der PHP-Datei, welche die Response liefert, stehen keine SQL-Statements, da werden nur noch Methoden aufgerufen, nach vorheriger Objekterstellung.

      Ich glaube dann würde ich gleich einen ORM (Object-Relational-Mapper) benutzen, gibt ja genügend fertige die sehr gut funktionieren.

      Jeena

    2. مرحبا

      Warum die Serverkonfiguration bemühen? Lege Deine Klasse in eine Datei und diese kann per require in jede andere php-Datei eingebunden werden. Hilfreich dazu ist auch ini_set('include_path', ...);

      Kleines Missverständnis. Ich habe noch meine Verständnisprobleme mit OOP, daher die Bitte an die Erfahrenen programmierer, die OOP im Schlaf beherrschen.
      Ich würde einfach gerne sehen, wie man schnippsel Sinnvoll in Klassen bekommt.
      Einfach als Denkanstoss für mich. Die besagte Funktion ist 33 Zeilen lang. Da ich mein Menu-Script in und auswendig kenne, könnte ich genau nachvollziehen, was in der Klasse geschieht.

      Ich brauche einfach nur ein Beispiel, wie es die Profis machen würden. Wenn's denn nicht zuviel verlangt ist.

      Ich hatte vor Ewigkeiten mal eine Paginator-Klasse geschrieben, die einzige Klasse, die ich je geschrieben habe. Und da ist auch das Problem, dass ich nicht abschätzen kann, ob es gut ist oder nicht.

      Paginator-Klasse

      mfg

      1. Moin,

        Ich würde einfach gerne sehen, wie man schnippsel Sinnvoll in Klassen bekommt.

        Gar nicht. OOP ist eine völlig andere Herangehensweise, die Basis ist das Datenmodell, nicht jedoch ein vorhandener Code (der natürlich genutzt werden kann). Der Entwurf beginnt also mit der Modellierung der Daten in Objekte.

        Btw., bei Deiner Paginator-Klasse habe ich gesehen, dass Du dem Konstruktor einen anderen Namen gegeben hast. Wenn der K. genauso heißt, wie die Klasse, können bereits beim Instanziiieren Parameter übergeben werden:

        $obj = new Class($attr);

        $attr ist vorteilhaft ein array(), im Konstruktor könntest Du dann auch ein array() mit Default-Werten haben, das Übergebene wird dann mit diesem gemischt (array_merge, Attribute mit Default-Werten vorbelegen, Defaults überschreiben).

        Viele Grüße,
        Hotti

        1. Tach!

          Btw., bei Deiner Paginator-Klasse habe ich gesehen, dass Du dem Konstruktor einen anderen Namen gegeben hast. Wenn der K. genauso heißt, wie die Klasse, können bereits beim Instanziiieren Parameter übergeben werden:

          Den Konstruktor nach dem Klassennamen zu benennen ist PHP4-OOP. Seit PHP5 heißt der Konstruktor __construct und man kann ihm ebenfalls Parameter übergeben. (Die Namen-Methode funktioniert aus Kompatibilitätsgründen). Der Vorteil ist, dass er nun auch bei Vererbung unter einem einheitlichen Namen angesprochen werden kann: parent::__construct(...) Mit der Namen-Methode musste man erst den Namen der Elternklasse ermitteln, um daraus den Konstruktor-Namen bilden zu können (wenn man nicht ständig bei einer kleinen Namensänderung und fester Benennung den Code nachziehen wollte). Der __construct() findet selbständig die Elternstruktur hinauf den nächstgelegenen Konstruktor.

          dedlfix.

          1. hi,

            Den Konstruktor nach dem Klassennamen zu benennen ist PHP4-OOP. Seit PHP5 heißt der Konstruktor __construct

            Bitte um Nachsicht, ich PHP bin ich noch nicht ganz so fit ;)

            [..] Der __construct() findet selbständig die Elternstruktur hinauf den nächstgelegenen Konstruktor.

            Alles gute Infos, danke Dir!!

            Hotti

            --
            Organspende? Das kann ich immer noch entscheiden, wenn ich tot bin!
        2. Moin,

          Ich würde einfach gerne sehen, wie man schnippsel Sinnvoll in Klassen bekommt.

          Gar nicht. OOP ist eine völlig andere Herangehensweise, die Basis ist das Datenmodell, nicht jedoch ein vorhandener Code (der natürlich genutzt werden kann). Der Entwurf beginnt also mit der Modellierung der Daten in Objekte.

          Ein kleiner Einblick in meine Vorgehensweise. Der Artikel ist noch nicht fertig. Das Thema ist auch ein Anderes, aber OOP heißt ja "Abstrahieren" ;)

          Viele Grüße an Alle,
          Hotti

          PS: Der verlinkte Artikel wird evntl. heute abend fertig. Aber jetzt erstmal raus in den Rheingau, die Sonne scheint gut!