2009-07-13 73 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类的数据成员不能拥有运行时计算的值,例如新的对象实例。所以,这是行不通的

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

注:final性质不允许除非方法

这其实真的很好奇,我认为你正在做一个类,负责两件事情 - 一个对象蓝图以及自身实例的静态存储。

无论如何,这里就是我认为你的代码看起来像在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 2009-07-13 15:24:03

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

但理论保持不变。