商品データベースの商品画像を管理するクラスを作りました。
ある商品に関連づけられる画像には区分で分類されています。
(画像区分2種 × 重要度3種 = 6パターン)
【画像区分】
共通・個別
【重要度】
高・中・低
PHP
1//画像管理クラス 2class ImageManager { 3 4 //画像データ 5 private $_image_data = []; 6 7 //出力順序 8 private $_output_order; 9 10 public function __construct(){ 11 12 $this->_image_data = [ 13 'common' => [ 14 'imp_high' => ['images' => [] ], 15 'imp_middle' => ['images' => [] ], 16 'imp_low' => ['images' => [] ] 17 ], 18 'individual' => [ 19 'imp_high' => ['images' => [] ], 20 'imp_middle' => ['images' => [] ], 21 'imp_low' => ['images' => [] ] 22 ], 23 ]; 24 25 //出力の順序を決める 26 $this->_output_order[] = &$this->_image_data['common']['imp_high']; 27 $this->_output_order[] = &$this->_image_data['common']['imp_middle']; 28 $this->_output_order[] = &$this->_image_data['common']['imp_low']; 29 $this->_output_order[] = &$this->_image_data['individual']['imp_high']; 30 $this->_output_order[] = &$this->_image_data['individual']['imp_middle']; 31 $this->_output_order[] = &$this->_image_data['individual']['imp_low']; 32 33 } 34 35 public function get_images() 36 { 37 foreach($this->_output_order as $images) 38 { 39 foreach($images['images'] as $img) 40 { 41 yield $img; 42 } 43 } 44 } 45 //画像を追加 46 public function add($img_kbn, $importance,$image) 47 { 48 $this->_image_data[$img_kbn][$importance]['images'][] = $image; 49 }
上記プログラムはなかり簡略化してしまったので間違っているかもしれませんが、
目的は区分/重要度別に画像を保持することと取り出しの順序の管理です。
データの入れ物は配列で作ってしまいました。
画像区分と重要度をキーにして必要なデータにアクセスできるので便利です。
出力順はコンストラクタで$this->_output_orderの配列に参照を入れています。
仕様変更で出力の順を変えたくなったらここを変更すればいいと思ったからです。
今のところ問題なく動いていますが、配列や参照を使ったこのプログラムは古いように思えます。
現在プログラムの見直しをしていまして、配列ではなくオブジェクトを使った分かりやすい実装に変えることができないか検討しています。
ここからが質問です(前置き長くてスイマセン)
画像を入れておく配列を下記クラスと置き換えてみました。
PHP
1class ImageBox { 2 private $img_kbn; 3 private $importance; 4 private $images = []; 5 6 public function __construct($img_kbn,$importance){ 7 $this->img_kbn = $img_kbn; 8 $this->importance = $importance; 9 } 10 public function add($image){ 11 $images[] = $image; 12 } 13 public function get(){ 14 return $images; 15 } 16}
最初のプログラムは下記となります。
PHP
1//画像管理クラス 2class ImageManager { 3 4 //画像データ 5 private $_image_data = []; 6 7 //出力順序 8 private $_output_order; 9 10 public function __construct(){ 11 12 $this->_image_data = [ 13 new ImageBox('common','imp_high'), 14 new ImageBox('common','imp_middle'), 15 new ImageBox('common','imp_low'), 16 new ImageBox('individual','imp_high'), 17 new ImageBox('individual','imp_middle'), 18 new ImageBox('individual','imp_low'), 19 ]; 20 21 //出力の順序を決める 22 $this->_output_order[] = $this->_image_data[0]; 23 $this->_output_order[] = $this->_image_data[1]; 24 $this->_output_order[] = $this->_image_data[2]; 25 $this->_output_order[] = $this->_image_data[3]; 26 $this->_output_order[] = $this->_image_data[4]; 27 $this->_output_order[] = $this->_image_data[5]; 28 } 29 30 public function get_images() 31 { 32 foreach($this->_output_order as $images) 33 { 34 foreach($images->get() as $img) 35 { 36 yield $img; 37 } 38 } 39 } 40 //画像を追加 41 public function add($img_kbn, $importance,$image) 42 { 43 //ここがわかりません 44 }
ImageManagerクラスのaddメソッドについて質問ですが
引数で与えられた$img_bknと$importanceから該当するImageBoxオブジェクトを選択して画像を追加したいのですが、どのようにImageBoxオブジェクトを探すのがいいでしょうか?
foreachで回しながら1つ1つ確認する方法しか思いつきません。
これならキーでアクセスできる配列の方がわかりやすい感じがしますが、データのチェックなど配列ではできない処理を実装する予定なので配列はやめようと思います。
よろしくお願いします。
あなたの回答
tips
プレビュー