2012-03-07 6 views
0

現在作業しているクラスに関連するフィールドの配列を持つ[一般的に広く使われていない] PHPフレームワークで作業していますSQLの列。私は「として、配列内の混合変数型の値変換を処理するためのより良い方法PHP

protected $fields = array('id', 'name', 'body'); 

function setFieldValue($field, $value) { 
    switch($field) { 
     case 'id': 
      return parent::setFieldValue($field, intval($value)); 
     case 'name': 
      return parent::setFieldValue($field, strval($value)); 
     case 'body': 
      return parent::setFieldValue($field, strval($value)); 
    } 
} 

私はもう少しダイナミックなもの(とクリーナーを探しています:

まあ、クラスの値を設定するためにそこにオブジェクトがこれを行うことになるようにクラスメソッドsetFieldValue、従来何か

protected $fields = array('id' => 'intval', 'name' => 'strval', 'body' => 'strval'); 

function setFieldValue($field, $value) { 
    if(array_key_exists($field, $this->fields)) { 
     return parent::setFieldValue($field, $fields[$field]($value)); 
    } 
} 

私はこの悪い習慣を誰もが考えているでしょうし、誰かが他の選択肢を提案してくれるでしょうか?

答えて

1

いいえ、どちらの場合でもフィールドの名前がそのクラスの外部に昇格されないため、正常に表示されます(switchまたはarray_key_exists)。だから、このには見えない内部的に(私的に)解決するので、違いはありません。

すべての変更がスムーズに行われたかどうかを確認するために、変更前と変更後の単位テストを実行します。

+0

私は文字列の値から関数を呼び出すという言葉を忘れています...私は動的クラスオブジェクトをインスタンス化することを避けるために何かを感じています。 –

+1

あなたが参照するものは 'setID($ id)、setName($ name)、setBody($ body)'などのようです。しかし、あなたの2つの例ではそうではありません。開発者の視点からは、明示的なインターフェイス(すべての場合、すべてのフィールドで定義された名前があります)が文字列のwishy-washyの名前より優れています。ただし、この規則には例外があります。あなたにとって何がベストか考えてみてください。あなたが与えた2つの例では、パブリックインターフェイスが変わらないので違いはありません。 – hakre

+0

このコードの上に明示的なインターフェイスが与えられましたが、これはどこにあるのか分かり、あなたの助けに非常に感謝しています。あなたが言ったことは私により良い理解を与えるのを助け、私は非常に感謝します、これはまさに私がこの投稿をしたときに探していたものです。 (私は他の開発者からより多くの回答を得たいと思っています) –

関連する問題