Statik değer nesnelerinin bir listesini oluşturmak için PHP çözüm

3 Cevap php

Ben yapılandırılabilir bir rapor var. foo as my_foo gibi bir şey - rapora dahil edilebilir her alan için, (rapor tercihlerinde saklanır) bir anahtar, bir etiket, potansiyel bir erişim seviyesi ve bir SQL tanımlayıcı var.

Bir Java uygulaması, yukarıda listelenen özelliklerin her biri ile ReportField adında bir sınıf yaratacak. Ben özel bir kurucu kullanın ve bu gibi sınıftaki alanların her biri listelemek istiyorum:

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

Herhalde benzeri, tüm alanları statik bir dizi oluşturmak alan anahtarla baktım sağlayan bir statik yöntem ekleyin, ve istiyorum. Sonra başka yerlerde ben gibi bir kod yazabilirsiniz:

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

Umarım benim açımdan Java kodu için özür dilemek, ama olsun.

PHP aynı sorunu çözmek için deyimsel bir yolu var mı? İç içe ilişkisel diziler hile yapacak - - Ben çözümleri bir dizi düşünüyorum ama ben bir hackish çözüm önlemek istiyorum.

3 Cevap

Sorunuzu yanlış sürece sadece, farklı yapmak için var - süper iyi Java bilmiyorum, ama bunu en yapabilirsiniz.

PHP sınıfları veri üyeleri gibi yeni nesne örnekleri olarak çalışma zamanı hesaplanmış değerleri, olamaz. Yani, bu iş olmaz

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

Note: final özellikler yöntemleri dışında izin verilmez

Bir nesne planı VE yanı sıra kendisi örnekleri için statik depolama - Aslında iki şey için bir sınıf sorumlu yapıyoruz benim için gerçekten merak ediyor.

Her neyse, burada think kod PHP gibi görünecektir ne

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

Java ile yaptığınız gibi Neden PHP nesneleri oluşturmak değil mi?

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

ve benzerleri.

Bunun dışında, ilişkisel diziler sadece iyi olabilir.

Ben özellikle çok farklı PHP Java daha bunu yapmak için herhangi bir neden göremiyorum. Aynı OOP işlevlerinin çoğu var ve siz de sizin için çalışıyor ne yapışabilir.

Gibi daha fazla bakmak istiyorum

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

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

ancak teori bozulmadan kalır.