PHP Klassen Aufbau

  • Hallo liebes Forum. Ich hab mich dazu entschlossen meine Seite mal Objektorientiert zu programmieren. Hab aber sofort zu beginn die ersten Schwierigkeite.

    Hier mal mein geplanter Aufbau:

    index.php

    PHP
    error_reporting(E_ALL);
    
    
    include('includes/classes/myxotod.class.php');
    
    
    $myxotod = new myxotod;

    myxotod.class.php

    PHP
    class myxotod {
        public function myxotod() {
            include('includes/cfg/config.cfg.php');
            include('includes/classes/datenbank.class.php');
            $db = new database;
        }
    }

    Erste Frage: Ist diese Art von Aufbau sinnvoll oder sollte ich das ganze anders machen? Mein problem hierbei ist folgendes:

    In der config.cfg.php ist ein Array, dieses heißt $config. Hier stehen unter anderem die Zugangsdaten zur Datenbank drin. Leider komme ich an diese in der datenbank.class.php nicht dran. In der datenbank Klasse versuche ich folgendes:

    global $config;
    $this->host = $config['host'];

    In $config['host'] scheint aber nichts drin zu stehen. :/
    Kann mir hier jemand weiterhelfen? Vielen Dank :)

    Don't follow me, I run into walls.

  • Irgendwie macht deine Herangehensweise keinen Sinn.
    Warum legst du die Konfiguration nicht im DB-Object ab?

    PHP
    include "config.php";
    require_once "database.class.php";
    $db = new Database();
    $db->setConfig($config);

    Achso: includes in Funktionsaufrufen: Großes Pfui!


  • Vielen Dank für die Antwort. Leider komme ich immernoch nicht ganz weiter.

    myxotod.class.php:

    PHP
    class myxotod {
        public function myxotod() {
            require('includes/cfg/config.cfg.php');
            require('includes/classes/datenbank.class.php');
            $db = new datenbank;
            $db->setConfig($config);
        }
    }

    datenbank.class.php:

    Leider kommt der Inhalt des $config-Arrays nicht in der Datenbankklasse an :(
    Wieso sollte ich lieber require statt include verwenden?

    Don't follow me, I run into walls.

  • wollen wir wetten, dass in der Klasse myxotod die Variable $config gar nicht existiert? ;)
    Für Klassen sollte es require_once sein, da das Fehlen einer Klasse meist zum Abbruch der Applikation führen soll.


  • Das kommt nicht an, weil du im Konstruktor auf die config zugreiffen willst, die du erst danach über setConfig übergibst. Der Konstruktor wird aber schon bei

    PHP
    $db=new datenbank;
    // btw, new datenbank; geht zwar, halte ich aber für unsauber
    $db=new datenbank();

    ausgeführt.
    Schau dir mal OOP in PHP an, hier: http://php.net/manual/de/language.oop5.php


    Achso: includes in Funktionsaufrufen: Großes Pfui!


    Wieso? Wenn

    PHP
    function ladeIrgendwas() {
        include("iwas_mit_infos.php");
        $auswerten=$IFNO;
    }

    schreibe, sind die inhalte von iwas_mit_infos.php nur in der Funktion verfügbar - kann doch sein, dass das durchaus im interesse liegt?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • jojo87: Im Konstruktor der Klasse myxotod kann ich $config ohne Probleme ausgeben. Es steht auch das drin, was drin stehen soll.
    Tobse: Hab den Klasse jetzt mal mit "()" erstellt. Das wird aber an meinem Problem leider nichts ändern^^ Ob man jetzt mit include oder require am besten Dinge einbindet sei auch mal so dahingestellt. Ich hab hier eigentlich gerade ein anderes Problem :D

    Don't follow me, I run into walls.

  • Hast du meinen Post auch ganz gelesen?
    Probier mal das:

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • __construct benutzen… include in einem Konstruktor macht keinen Sinn, die Objekterzeugung soll irgendwelche Ausgaben erzeugen? Oder sollen Funktionen importiert werden? Beides macht keinen Sinn. Zum Importieren benutze autoloading und require_once. Was soll ein myxotod sein?

  • Häh? Was der Konstruktor von datenbank machen soll ist doch ganz klar - eine verbindung zur datenbank aufbauen. Wer redet da von includen und ausgeben?

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Was soll das bringen:

    PHP
    $this->username = $config['username'];
    $this->password = $config['password'];
    $this->datenbank = $config['datenbank'];


    Das Umschreiben auf eine andere Variable ist sinnlos, genauso wie sich die Daten überhaupt zu merken.

  • PHP
    class myxotod {
        public function myxotod() {
            include('includes/cfg/config.cfg.php');
            include('includes/classes/datenbank.class.php');
            $db = new database;
        }
    }

    Da wird ja wohl included. Fürs zweite include machst du lieber Autoloading und fürs erste nimm lieber ne ini-Datei o.ä. Was mit der Variable $db geschieht, ist ungewiss…

    @Unregistriert
    Das ist kein Umschreiben, er benutzt halt ein assoziatives Array zur Parameterübergabe.

    Tobse
    Mach lieber Parameter $user, $pw etc.

  • Ich wollte damit eig. Sein problem beheben. aber bevor irgendwer eine klasse schreibt, die die mysql_* funktionen verpakt, sollte man eher gleich

    PHP
    $db=new mysqli($host, $user, $passwort, $datenbankname);
    // FTW!

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • [QUOTE=The User;382071Das ist kein Umschreiben[/QUOTE]

    PHP
    $config = $this->config;
    $this->host = $config['host'];
    $this->username = $config['username'];
    $this->password = $config['password'];
    $this->datenbank = $config['datenbank'];


    Was soll das sonst sein? Da ist jede Zeile überflüssig, beim mysql_connect auf $this->config['host'], etc. zugreifen und fertig.

  • Vielen Dank für eure Antworten. Das "umschreiben" mach ich deswegen, weil ich es dort halt eben gleichmäßig haben will. Da mein Internet gerade nicht richtig will werde ich morgen nochmal weiterprobieren mit euren Tipps. Danke bisher.

    Don't follow me, I run into walls.

  • Ich habe das ganze jetzt mal abgeändert. Läuft soweit auch. Hab es jetzt mal so gemacht, wie Tobse es eine Seite zuvor vorgeschlagen hat.

    myxotod.class.php

    datenbank.class.php

    Vielen dank für die Informationen und Tipps. Was ein myxotod ist? :D So nenne ich mich sonst, wie man an meiner Webseite erkennen kann^^

    Don't follow me, I run into walls.

  • Dad heisst diene seite wird vonneiner instanz von dir selbst errechnet? Programmiertechnisch kein problem, aber semantisch. Z.B könnte man bei Joomla schreiben (soweit ich weiss nutzt joomla oop eher wenig):

    PHP
    $cms=new JoomlaCMS();
    $cms->seiteLaden();

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Meine Webseite programmiere ich immer selbst aber ich arbeite nebenbei noch mit vielen anderen Systemen. Dort wird als Name der "Haupt"-Klasse auch meistens der Name des Systems verwendet. Zumbeispiel Etomite oder ModX.
    Das was ich hier jetzt gerade programmiere soll ja nur unter meiner Seite laufen. Falls ich etwas programmieren würde, was andere auch benutzen könnten, würde ich die Namenswahl anders machen.

    Don't follow me, I run into walls.

  • Ja, mir gings nur drum, dass du das prinzip verwtehst. Eer Sinn von OOP ist ja, im Programmcode eine möglichst gute Nachbildung der (theoretischen) Relität zu haben. Das hilft beim nachvollziehen und beim finden von Fehlern. Aber mach wie du es für richtig hälst, ist ja dein programm ;).

    P.S.: Noch ein Bsp:

    PHP
    $forum=new vBulletin("Forum-Hilfe");
    while ($forum->hasUnawnseredThred()==true) {
        $thread=$forum->getnextUnAwnseredThread();
        while(!$thread->solved()) {
            $thread->post(createAwnser($thread->getLastPosting()));
        }
    }
    echo "alles palleti";

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!

  • Komme zu meiner nächsten Frage, werde deswegen jetzt keinen neuen Thread aufmachen, da ich mir sicher bin, dass ihr mir schnell helfen könnt. Versteh nicht ganz wieso es nicht klappt.

    Struktur:
    index.php
    -myxotod.class.php
    --cache.class.php

    In der Cache Klasse prüfe ich ob der Ordner "/tmp/cache" existiert. Wenn neun soll dieser erstellt werden.

    Leider bekomme ich bei dem ganzen hier folgende Fehlermeldung:
    "Warning: mkdir() [function.mkdir]: No such file or directory in /www/htdocs/user/root/includes/classes/cache.class.php on line 11"

    Folgendes steht in dirname($this->cachePath):
    "/www/htdocs/user/root/tmp/cache"

    Hat jemand eine Idee was hier falsch ist?

    Don't follow me, I run into walls.

  • Du kannst kein verzeichniss "cache" in "tmp" erstellen, wenn "tmp" nicht existiert. Ergo

    PHP
    mkdir("tmp");
    mkdir("tmp/cache");


    BTW 1.: Zum Cachen von variablen/objekten besser sowas wie APC verwenden.
    BTW 2.: Ich weiss nicht, wie sicher $_SERVER['DOCUMENT_ROOT'] ist und wie es durch verändern des Requests verändert werden kann, lass es besser weg. Mit relativen Pfaden klappt das auch.

    Der, der weiß dass er nichts weiß, weiß mehr als der, der nicht weiß, dass er nichts weiß.

    Wer nach etwas fragt, geht grundsätzlich das Risiko ein, es auch zu bekommen!