Sven Rautenberg: Doppeltes Array in Arraydefinition im Funktionskopf

Beitrag lesen

Moin!

in meiner Klasse "query" habe ich folgenden Funktionskopf:

function extend_sql($sql, $limit=array($conf['select_limit_grnd'], $conf['select_limit_ceil']))
{

}


>   
> Das Array "conf" wurde in der Datei config.php festgelegt und kommt auch definitiv in meiner Klasse an.  
  
Wie dedlfix bereits ausführte, ist es nur erlaubt, feste Werte als Default für Funktionsparameter anzugeben, keine Variablen.  
  
Dein Problem lässt sich grundsätzlich aber auch anders lösen. Einerseits wie von dedlfix vorgeschlagen: $limit = NULL, und in der Funktion dann die Prüfung, ob $limit NULL ist - wenn ja, dann werden die Standardwerte des $conf-Arrays verwendet.  
  
Das ist aber keine schöne Lösung, denn damit legst du dich auf das Vorhandensein einer globalen Variablen fest.  
  
Besser dürfte sein, diese Standardwerte direkt beim Instantiieren deiner Klasse zu übergeben, und dann schon als protected-Eigenschaft im Objekt zu speichern. Du greifts in der extend\_sql() also nicht auf $conf['fester\_wert'] zurück, sondern auf $this->\_conf['fester\_wert'], sofern nicht explizit ein Parameter übergeben wurde.  
  
~~~php
class query {  
  protected $_conf=array();  
  public function __construct($conf=array()) {  
    $this->_conf = $conf;  
  }  
  public function extend_sql($sql, $limit=NULL) {  
    if (is_null($limit)) {  
      $lgrnd = $this->_conf['select_limit_grnd'];  
      $lceil = $this->_conf['select_limit_ceil'];  
    } elseif (is_array($limit)) {  
      list($lgrnd,$lceil) = $limit;  
    } else {  
      throw new Exception('Parameter Error for Limit: Must be an array');  
    }  
    // ...  
  }  
}  
  
$q = new query($conf);  
$q->extend_sql('...'); // Standardwerte  
$q->extend_sql('...',array(0,30)); // explizites Limit  

Wie kann ich trotzdem meine Arrayelemente aus $conf dort einfügen?

Zusätzlich zu dieser oben kurz skizzierten Methode wäre vermutlich die Verwendung des Registry-Patterns nicht falsch. Dann hättest du eine zentrale Instanz eines Objektes, in der alle Konfigurationsparameter gespeichert sind. Auf der anderen Seite aber erzeugt das, ähnlich wie eine globale Variable, unschöne Abhängigkeiten, die die Testbarkeit deines Codes negativ beeinflussen. Insofern ist das Übergeben von relevanten Konfigurationsparametern an den Konstruktor eine viel schönere Methode, jedenfalls aus Sicht der Testbarkeit.

- Sven Rautenberg