2009-07-13 5 views
2

私は構成可能なレポートを持っています。レポートに含めることができる各フィールドには、キー(レポート設定に保存されています)、ラベル、潜在的にアクセスレベル、およびSQLディスクリプタ(foo as my_fooなど)があります。静的な値オブジェクトのリストを作成するためのPHPソリューション

Javaアプリケーションでは、上記の各プロパティを持つReportFieldというクラスを作成します。私はプライベートコンストラクタを使用して、リストの各フィールドを、このようなクラスにしたい:

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

は、私はおそらくフィールドのすべての静的な配列を作成したい、フィールドにすることができます静的メソッドを追加しますキーで調べるなど。そして、他の場所で私のようなコードを書くことができます。

List<String> selectFields = new ArrayList<String>(); 
for (ReportPref pref : reportPrefs) { 
    selectFields.add(ReportField.getByKey(pref.getField()).getFieldSql()); 
} 

Javaコードのための謝罪、うまくいけば、あなたは私のポイントを得ます。

PHPで同じ問題を解決する慣用方法はありますか?ネストされた連想配列がトリックを行うことになるいくつかのソリューションが考えられますが、私はハックな解決方法を避けたいと思います。

答えて

1

私はJavaのスーパー井戸についてよくわかりませんが、あなたはそのほとんどを行うことができます。あなたの質問を誤解しない限り、別の方法で行う必要があります。

PHPクラスのデータメンバーは、新しいオブジェクトインスタンスなどの実行時計算値を持つことができません。オブジェクトの青写真 - finalプロパティはメソッドを除いて許可されていませんそれは実際にあなたが二つのもののための1つのクラス責任を作っていることを私には本当に好奇心旺盛だ

:だから、これは

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

注動作しないでしょうそれ自身のインスタンスのための静的な記憶域もあります。とにかく

が、ここで私はあなたのコードは、以前の答えを読んだ後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

で次のようになり考える何、これは私には思えた論理的なアプローチです。コレクションを遅延的に初期化する静的なアクセス方法は、最も論理的なアプローチのようです。 なぜ私はこのアプローチをとっているのですか?それは、プログラマー以外の不変な複数のプロパティを持つオプションのセットを作成する良い方法です。通常は、このようなことにデータベーステーブルを使用するだけですが、アプリケーションに結び付けられているため、データの一部ではなくコードの一部にするのが理にかなっています。 (たとえそれがデータであっても)。 – Rafe

4

JavaのようにPHPでオブジェクトを作成してみませんか?

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(); 
} 

など。

それ以外は、連想配列でも問題ありません。

0

私は、PHPとはJavaとは大きく異なる理由は特にありません。同じOOP機能の大部分はそこにあり、あなたのために働いているものに固執することもあります。

それはより

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

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

のように見えると思いますが、理論はそのまま残ります。

関連する問題