独自の基底クラスを作っておく。メッセージ周り編

classを作るとき、継承って使ってますか?

まー継承そのものの説明はここでは省略します。

googleで、「class 継承」あたりで調べてみてください。

で、私がclassを作るときには、ほぼ必ずと言ってよいくらい、あるclassを継承することにしています。

それが、「Aulta_Object」です。

どのclassでも使用することの多そうな、変数、メソッドを「Aulta_Object」に書いておき、新しく作るclass側では、「Aulta_Object」を継承することでclassごとに実装する手間を省いているわけです。

<?php
/*
 * オブジェクトクラス
 * 全てのクラスは、これを継承する
 */
class Aulta_Object{
  
  private $infoMessage = array();
  private $errorMessage = array();
  
  /*
   * コンストラクタ
   */
  private function __construct() {
    
  }
  
  /*
   * デストラクタ
   */
  public function __destruct() {
    
  }
  
  /*
   * メッセージクリア
   */
  public function clearInfoMessage(){
    $this->infoMessage = array();
  }
  
  /*
   * メッセージセット
   */
  protected function pushInfoMessage($val){
    if (is_array($val)){
      foreach ($val as &$value){
        array_push($this->infoMessage, $value);
      }
    } else if (strlen(trim($val)) > 0){
      array_push($this->infoMessage, $val);
    }
  }
  
  public function getInfoMessages(){
    return $this->infoMessage;
  }
  
  /*
   * メッセージゲット
   */
  public function getTextInfoMessage(){
    $ret = '';
    if ($this->isInfo()){
      foreach ($this->infoMessage as &$value){
        $ret .= $value . CA_LF;
      }
    }
    return $ret;
  }
  
  /*
   * メッセージゲット
   */
  public function getHtmlInfoMessage(){
    $ret = '';
    if ($this->isInfo()){
      foreach ($this->infoMessage as &$value){
        $ret .= '<li><span style="color:green;">' . $value . '</span></li>';
      }
      return '<ul class="info">' . $ret . '</ul>';
    }
    return $ret;
  }
  
  /*
   * メッセージがあればtrue
   */
  public function isInfo(){
    return (count($this->infoMessage) > 0);
  }
  
  /*
   * エラーメッセージクリア
   */
  public function clearErrorMessage(){
    $this->errorMessage = array();
  }
  
  /*
   * エラーメッセージセット
   */
  protected function pushErrorMessage($val){
    if (is_array($val)){
      foreach ($val as &$value){
        array_push($this->errorMessage, $value);
      }
    } else if (strlen(trim($val)) > 0){
      array_push($this->errorMessage, $val);
    }
  }
  
  public function getErrorMessages(){
    return $this->errorMessage;
  }
  
  /*
   * エラーメッセージゲット
   */
  public function getTextErrorMessage(){
    $ret = '';
    if ($this->isError()){
      foreach ($this->errorMessage as &$value){
        $ret .= $value . CA_LF;
      }
    }
    return $ret;
  }
  
  /*
   * エラーメッセージゲット
   */
  public function getHtmlErrorMessage(){
    $ret = '';
    if ($this->isError()){
      foreach ($this->errorMessage as &$value){
        $ret .= '<li><span style="color:red;">' . $value . '</span></li>';
      }
      return '<ul class="error">' . $ret . '</ul>';
    }
    return $ret;
  }
  
  /*
   * エラーが発生していればtrue
   */
  public function isError(){
    return (count($this->errorMessage) > 0);
  }
}

もうかなり長いこと使ってますが、今はこの形で落ち着いています。

で、次のように新しいclassを作ってみます。

class sample extends Aulta_Object{
  
  private $_value = 1;
  
  public function setValue($val){
    if ($val が正常な形式かチェック){
      $this->_value = $val;
    } else {
      $this->pushErrorMessage('valueの値がおかしいよ');
    }
  }
  
  public function save(){
    // ファイル・DBに保存する処理
    if (問題なく保存できた){
      $this->pushInfoMessage('保存したよー');
    } else {
      $this->pushErrorMessage('保存に失敗したよ');
    }
  }
}

で、実際にclassを使ってみましょう。

$sample = new sample();

$sample->setValue('サンプル');
if ( ! $sample->isError()){
  $sample->save();
}

if ($this->isError()){
  echo $sample->getHtmlErrorMessage();  // エラーメッセージ
} else {
  echo $sample->getHtmlInfoMessage();  // 通常メッセージ
}

というわけで、メッセージ関連を基底クラスに持って来ようってわけです。

別に、「class message」って、メッセージクラスを作ってもいいんですけどね。

 

長くなるのもなんなので、今回は、「Aulta_Object」に書いてあるメッセージの部分だけの掲載としました。

残りについても順に載せていきます。

あとあと、今はまだ「Aulta_Object」もリファクタするほどでもないから、こうしているけど、

もしかしたらリファクタして別の場所に置くことになるかもですってことです。