PHP решение для создания списка объектов статических значений - PullRequest
2 голосов
/ 13 июля 2009

У меня есть настраиваемый отчет. Для каждого поля, которое может быть включено в отчет, есть ключ (сохраненный в настройках отчета), метка, потенциально уровень доступа и дескриптор 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? Я могу придумать несколько решений - вложенные ассоциативные массивы помогут, но я бы хотел избежать хакерского решения.

Ответы [ 3 ]

4 голосов
/ 13 июля 2009

Почему бы не создать объекты в PHP, как в 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();
}

и т. Д.

Кроме этого, ассоциативные массивы могут быть очень хорошими.

1 голос
/ 13 июля 2009

Я не очень хорошо знаю 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 голосов
/ 13 июля 2009

Я не вижу особой причины делать это совсем иначе в PHP, чем в Java. Большинство таких же функций ООП есть, и вы можете также придерживаться того, что работает для вас.

Это было бы больше похоже на

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

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

но теория остается неизменной.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...