2009-07-13 9 views
2

Ich habe einen konfigurierbaren Bericht. Für jedes Feld, das in den Bericht aufgenommen werden kann, gibt es einen Schlüssel (in den Berichteinstellungen gespeichert), eine Beschriftung, möglicherweise eine Zugriffsebene und einen SQL-Deskriptor - etwa foo as my_foo.PHP-Lösung zum Erstellen einer Liste von statischen Wertobjekten

In einer Java-App würde ich eine Klasse namens ReportField mit jeder der oben aufgeführten Eigenschaften erstellen. Ich würde einen privaten Konstruktor verwenden, und die Liste jedes der Felder in der Klasse wie folgt:

public final static ReportField FOO = new ReportField('foo', 'Foo', 1, 'foo as my_foo'); 

ich wahrscheinlich eine statische Anordnung von allen Feldern schaffen würde, eine statische Methode hinzufügen, die ein Feld erlaubt mit Schlüssel gesucht werden, und so weiter. Dann könnte ich an anderer Stelle Code wie schreiben:

Entschuldigung für den Java-Code, aber hoffentlich bekommen Sie meinen Punkt.

Gibt es einen idiomatischen Weg, um das gleiche Problem in PHP zu lösen? Ich kann mir eine Reihe von Lösungen vorstellen - verschachtelte assoziative Arrays werden den Zweck erfüllen - aber ich möchte eine hackische Lösung vermeiden.

Antwort

1

Ich kenne Java nicht wirklich gut, aber Sie können das meiste davon tun - müssen Sie es nur anders machen, es sei denn, ich missverstehen Ihre Frage.

Datenelemente in PHP-Klassen können keine von der Laufzeit berechneten Werte haben, z. B. neue Objektinstanzen. Also, das würde nicht funktionieren

class ReportField 
{ 
    public static $foo = new ReportField() 
} 

Hinweis: final Eigenschaften sind nicht erlaubt, außer auf Methoden

Es ist eigentlich wirklich neugierig zu mir, dass du für zwei Dinge einer Klasse verantwortlich machst - ein Objekt Plan UND statischen Speicher für Instanzen von sich selbst. Wie dem auch sei

, hier ist was ich denke, Ihr Code wie in PHP

<?php 

class ReportField 
{ 
    public static $store = array(); 

    private 
    $key, 
    $label, 
    $accessLevel, 
    $sql; 

    private function __construct($key, $label, $accessLevel, $sql) 
    { 
    $this->key = $key; 
    $this->label = $label; 
    $this->accessLevel = $accessLevel; 
    $this->sql = $sql; 
    } 

    public static function initializeStore() 
    { 
    if (empty(self::$store)) 
    { 
     self::$store['foo'] = new self('foo', 'Foo', 1, 'foo as my_foo'); 
     // repeat 
    } 
    } 

    public static function getByKey($key) 
    { 
    if (empty(self::$store)) 
    { 
     self::initializeStore(); 
    } 
    if (isset(self::$store[$key])) 
    { 
     return self::$store[$key]; 
    } 
    throw new Exception(__CLASS__ . " instance identified by key $key not found"); 
    } 

    public function getFieldSql() 
    { 
    return $this->sql; 
    } 
} 

// Usage 
$selectFields = array(); 
foreach ($reportPrefs as $pref) 
{ 
    $selectFields[] = ReportField::getByKey($pref->getField())->getFieldSql(); 
} 
+0

aussehen würde die früheren Antworten Nach der Lektüre, das ist der Ansatz, der mir schien logisch. Eine statische Methode für den Zugriff, die die Sammlung träge initialisiert, scheint der logischste Ansatz zu sein. Warum ich diesen Ansatz wählen würde, ist es eine schöne Möglichkeit, eine Reihe von Optionen mit mehreren Eigenschaften zu erstellen, die außer vom Programmierer unveränderlich sind.Normalerweise würden Sie nur eine Datenbanktabelle für diese Art von Dingen verwenden, aber aufgrund der Art und Weise, in der es in die App eingebunden ist, ist es sinnvoller, einen Teil des Codes als einen Teil der Daten zu machen. (Obwohl es Daten sind.) – Rafe

4

Warum erstellen Sie keine Objekte in PHP wie in Java?

class ReportField { 
    private $key; 

    public __construct($key, $label, $access_level, $sql) { 
    $this->key = $key; 
    ... 
    } 

    public getKey() { return $this->key; } 

    ... 
} 

$fields = array(
    new ReportField(...), 
    new ReportField(...), 
); 

foreach ($fields as $field) { 
    echo $field->getKey(); 
} 

und so weiter.

Darüber hinaus können assoziative Arrays gut sein.

0

Ich sehe keinen Grund, es in PHP sehr anders zu machen als in Java. Die meisten der gleichen OOP-Funktionalität ist da, und Sie können auch bei dem bleiben, was für Sie arbeitet.

würde es eher wie

$foo = new ReportField('foo', 'Foo', 1, 'foo as my_foo'); 

$selectFields = array(); 
foreach($reportPrefs as $pref) 
    $selectFields[] = ReportField::getByKey($pref->getField())->getFieldSql(); 

aber die Theorie bleibt intakt.

Verwandte Themen