用于创建静态值对象列表的PHP解决方案

时间:2009-07-13 14:05:29

标签: php oop

我有一份可配置的报告。对于可以包含在报告中的每个字段,都有一个密钥(存储在报告首选项中),一个标签,一个可能的访问级别和一个SQL描述符 - 类似于foo as my_foo

在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中解决同样的问题是否有惯用的方法?我可以想到一些解决方案 - 嵌套的关联数组可以解决这个问题 - 但我想避免使用hackish解决方案。

3 个答案:

答案 0 :(得分: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();
}

等等。

除此之外,关联数组可以很好。

答案 1 :(得分: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();
}

答案 2 :(得分: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();

但理论仍然完好无损。