.MB: Configurations Parameter seprat in Klassen abspeichern?

moin Community,

ist es sinnvoll eine Configuration in einer Klasse zuspeichern und geforderte Paarameter in Funktionen zu übergeben?

Vorteil:

  • Man mus nicht auf $_GLOBALS zugreifen was ja ungerne gesehen wird
  • Viele Cofigurations Parameter (z.B.: SQL Teiber) sind unwichtig für ausenstehende die nicht mit dem Programm vertraut sind.
  • Alle PHP Funktionen hätte über die Einbindung zugriff auf die Config Daten.

Nachteil:

  • Ich wüsste keine

Wichte Configurationsdateien (z.B.:wie Datenbanknamen usw) würde ich in INI-Datei ablegen wie mir empfohlen wurde.

Grüße MB

  1. moin Community,

    ist es sinnvoll eine Configuration in einer Klasse zuspeichern und geforderte Paarameter in Funktionen zu übergeben?

    Nicht in der Klasse sondern in der Instanz. Nimm mal den Fall, dass mehrere Konfigurationen permanent im Hauptspeicher resident sind, da wird das Warum deutlicher:

    Bei jedem Request wird eine Instanz erstellt und die schnappt sich die jeweils passende Konfiguration, z.B. abhängig von der Domäne oder von der Sprache oder vom angemeldeten Benutzer. Praktisch bekommt die Instanz eine Referenz auf die Konfiguration.

    Über die Instanz wird alles abgewickelt, was Request betrifft und nachdem über die Instanz die Response ausgeliefert wurde, wird die Instanz hingerichtet (destroy). Die Konfiguration jedoch verbleibt entweder im Hauptspeicher (FastCGI, mod_perl) oder sie wird zurück auf die Platte geschrieben.

    Nun kannst Du dir ungefähr vorstellen, wie die Klasse beschaffen sein muss, woraus eine solche Instanz erstellt wird, die in sich selbst weitere Instanzen trägt wie z.B. Session- o.a. Benutzerdaten und letztendlich die gesamte Verantwortung trägt von der Entgegennahme des Request bis zur Auslieferung der Response.

    Hier setze ich die Vererbung an: Die Superclass definiert alles das was jede Seite braucht (header, body, footer, menu). Die abgeleitete Klasse hingegen spezialisiert den MVC.

    Demnächst mehr auf perl.rolfrost.de

    1. Hallo pl,

      ist es sinnvoll eine Configuration in einer Klasse zuspeichern und geforderte Paarameter in Funktionen zu übergeben?

      Nicht in der Klasse sondern in der Instanz. Nimm mal den Fall, dass mehrere Konfigurationen permanent im Hauptspeicher resident sind, da wird das Warum deutlicher:

      so ungefähr wollte ich das auch machen oder verstehe ich dich falsch. Um das zu klören mach bite n konkretes beispiel.

      LG MB

      1. Konkretes Beispiel:

        Zu prüfen ist, ob zu [REDIRECT_URL] eine Klasse konfiguriert ist, wenn nicht, heißt die Klasse NotFound. In jedem Fall wird eine Instanz erstellt.

        mfg

        1. Konkretes Beispiel:

          Zu prüfen ist, ob zu [REDIRECT_URL] eine Klasse konfiguriert ist, wenn nicht, heißt die Klasse NotFound. In jedem Fall wird eine Instanz erstellt.

          REDIRECT_URL ist eine Variable der Serverumgebung. Was mein konkretes Beispiel zeigt: Die Konfiguration wird vor und nach der Instanzerstellung benötigt.

          Ergo muss es eine von der Instanz unabhängige Funktion geben zum Lesen der Konfiguration von der Festplatte in den Hauptspeicher. Und wie ich bereits erwähnt habe, wird die Konfiguration dem Konstruktor mitgegeben, was für die Instanz den wahlfreien Zugriff ermöglicht.

          Eine Demo zeigt wozu der wahlfreie Zugriff gut ist: class=Folder listet alle konfigurierten URLs welche dasselbe Attibut parent=/index haben.

          1. nabend pl,

            Eine Demo zeigt wozu der wahlfreie Zugriff gut ist: class=Folder listet alle konfigurierten URLs welche dasselbe Attibut parent=/index haben.

            werds mir ansehen und danke dir.

            Gruß MB

            1. Hallo pl,

              sry, ich kann da nix sehen. wie Matthias Apsel schon gesagt hat.

              Herzlichste Grüße MB

          2. Hallo pl,

            Eine Demo zeigt wozu der wahlfreie Zugriff gut ist: class=Folder listet alle konfigurierten URLs welche dasselbe Attibut parent=/index haben.

            Diese Demo zeigt eine Internetseite, sonst nichts. Deine Behauptung, was class=Folder tut, lässt sich nicht überprüfen.

            Bis demnächst
            Matthias

            --
            Das Geheimnis des Könnens liegt im Wollen. (Giuseppe Mazzini)
  2. Servus .MB,

    leider verstehe ich dein Anliegen nicht wirklich.

    ist es sinnvoll eine Configuration in einer Klasse zuspeichern und geforderte Paarameter in Funktionen zu übergeben?

    Welche Parameter sollen welchen Funktionen übergeben werden? Was hat das mit einer Konfiguration zu tun? Der Satz ist etwas unverständlich formuliert.

    • Viele Cofigurations Parameter (z.B.: SQL Teiber) sind unwichtig für ausenstehende die nicht mit dem Programm vertraut sind.`

    Dem Benutzer ist das (in der Regel) völlig egal.

    Bitte versuche trotzdem, Konfigurationen an einer zentralen Stelle zu sammeln. Dein Zukunfts-Ich und jeder andere Entwickler, der sich deinen Code ansieht, wird dir dankbar sein.

    Wichte Configurationsdateien (z.B.:wie Datenbanknamen usw) würde ich in INI-Datei ablegen wie mir empfohlen wurde.

    Achte hier darauf, dass man die Datei nicht aufrufen kann, z.B. so: example.com/config/cfg.ini

    ciao

    --
    "Sir, we are surrounded!" - "Excellent! We can attack in any direction!"
    1. Hallo henman,

      sorry das es so lang gedauert hat

      leider verstehe ich dein Anliegen nicht wirklich.

      ist es sinnvoll eine Configuration in einer Klasse zuspeichern und geforderte Paarameter in

      ok, um Zugriff z.B. auf eine Datenbank zu gewähleisten braucht man parameter Treiber, Hostname, Datenbank usw. Ich könnte das so...

      $dbh = new PDO( mysql:dbname=irgendwas;host=irgendwer;charset=utf-8 );
      

      aber auch so ...

      
      class connect {
      
      private dbn;
      ...
      
      public function __construct( $user, $pass, $dbn ) {
        $this->dbn = $dbn;
        ...
      }
      
      private function configConection() {			
        $drv = "{$this->drv}:";
        $dbn = "dbname={$this->dbn}";
        $host = "host={$this->host}";
        $char = "charset={$this->charset}";
        $this->dsn = "$drv:$dbn;$host;$char";
      }
      
      private function connect() {
        define( "USER", $this->user );
        define( "PASS", $this->pass );
        define( "DSN",  $this->dsn );
        try {
          $this->DBH = new PDO( DSN, USER, PASS );
          $this->DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_SILENT );
        } catch ( PDOException $err ) {
          $this->getError();
        }
      }
      

      Welche Parameter sollen welchen Funktionen übergeben werden? Was hat das mit einer Konfiguration zu tun? Der Satz ist etwas unverständlich formuliert.

      Die angeforderten Paramter der Konstruktor Funktion. Ich will die in einer Classe ablegen

      class config {
      
        private dbn = "irgendwas",
        ...
      
        public function getDBN() {
          return $this->dbn;
        }
      
        ...
      }
      
      • Viele Cofigurations Parameter (z.B.: SQL Teiber) sind unwichtig für ausenstehende die nicht mit dem Programm vertraut sind.`

      Dem Benutzer ist das (in der Regel) völlig egal.

      sehr richtig aber für den Admin denke ich nicht.

      Bitte versuche trotzdem, Konfigurationen an einer zentralen Stelle zu sammeln. Dein Zukunfts-Ich und jeder andere Entwickler, der sich deinen Code ansieht, wird dir dankbar sein.

      Danke für deinen Rat. Das werde ich unteranderem mit hilfe dieses Forums machen.

      Wichte Configurationsdateien (z.B.:wie Datenbanknamen usw) würde ich in INI-Datei ablegen wie mir empfohlen wurde.

      Achte hier darauf, dass man die Datei nicht aufrufen kann, z.B. so: example.com/config/cfg.ini

      Davon gehe ich aus. aber ich programmiere nur den Quellcode. implementieren muss das der Anwender.

      Ich hoffe du verstehst jetzt mein anliegen und meine Fragen. Wenn neue Fragen auftauchen bin ich gern bereit bestmöglichst zu antworten.

      Herzliche Grüße MB

      1. Tach!

        private function connect() {
          define( "USER", $this->user );
          define( "PASS", $this->pass );
          define( "DSN",  $this->dsn );
          try {
            $this->DBH = new PDO( DSN, USER, PASS );
        

        So nicht! Was sollen denn die Konstanten hier? Die sorgen dafür, dass man diese Methode nur genau einmal aufrufen darf, sonst bekommt man Gemecker, dass die Konstanten schon existieren. Konstanten werden global angelegt, diese Werte braucht man aber nur lokal. Und zum anderen kann man keine zwei verschiedenen Verbindungen aufbauen, weil die Konstanten mit dem Inhalt vom ersten Aufruf weiter existieren. Das Erstellen der Konstanten ist ein unnützer Zwischenschritt.

        Welche Parameter sollen welchen Funktionen übergeben werden? Was hat das mit einer Konfiguration zu tun? Der Satz ist etwas unverständlich formuliert.

        Die angeforderten Paramter der Konstruktor Funktion. Ich will die in einer Classe ablegen

        Man könnte eine DB-Config-Klasse erstellen, die sich um das Zusammenstellen des DSN kümmert und auch die anderen Daten bereithält.

        Bedenke aber, das jeder Code ausgegeführt werden muss und Laufzeit verbraucht. Zugriffsmethoden, die lediglich einen private gespeicherten Wert rausrücken, mögen nett sein, weil sie den Zugriff kapseln. Aber das macht die Ausführung nicht schneller. Das ist bei kompilierenden Systemen eine oder mehrere Größenordnungen weniger tragisch, weil es meist trotzdem schnell genug ist. Bei halbinterpretierten Sprachen wie PHP sollte man es sich überlegen, ob man das unbedingt so komplex braucht.

        Wichte Configurationsdateien (z.B.:wie Datenbanknamen usw) würde ich in INI-Datei ablegen wie mir empfohlen wurde.

        Achte hier darauf, dass man die Datei nicht aufrufen kann, z.B. so: example.com/config/cfg.ini

        Das ist so pauschal gesagt kein sinnvoller Rat. Es kommt drauf an, was der Code in der aufzurufenden Datei macht. Und wie irgendwelche eingegebenen Werte da hineingelangen. Zudem kann auch beim Parsen von Ini- und anderen Dateien ein Programmierfehler zuschlagen.

        dedlfix.