我有一份可配置的报告。对于可以包含在报告中的每个字段,都有一个密钥(存储在报告首选项中),一个标签,一个可能的访问级别和一个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解决方案。
答案 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();
但理论仍然完好无损。