第17回 スケジューラーを作ろう(7) - 処理の関数化、任意の日付の取得 - - PHP基礎講座

PHPセキュリティ

Saity先生のPHP基礎講座

Lecutures on PHP

第17回 スケジューラーを作ろう(7) - 処理の関数化、任意の日付の取得 - (その1)

 このエントリーをはてなブックマークに追加
  • みなさま、新年明けましておめでとうございます☆
  • おめでと~ございます☆・・って先生、もう年明けてだいぶたちますよ!
  • ちょっと多めに休みをもらって、PHPの様々な新しい話題について学んでいたんだ♪
  • 休んでもPHPなんだ。。。
  • まだまだ、僕も学ぶことは尽きないからね。
  • おおぉ、ちょっとこれからを期待させますね。。。
  • それではみなさま、今年も一年、Saity先生のPHP講座をよろしくお願いします!
  • さぁ、第17回のはじまりはじまり~。

共通の処理を関数化する

  • さて、前回までにやったことはきちんと復習してあるかな?
  • もちろん!前回は、ユーザー定義関数について教えてもらったわ。
  • そうだったね。それじゃ、実際にスケジューラーの中でユーザー定義関数を使ってみようか。スケジューラーの編集と削除のロジックを思い出してごらん。
  • えっと、たしかこんな感じだったはず。。。

 

<?php
if (isset($_POST["regist"])) {
  
/**
   * ボタンが押された後の、バリデーション
   * 中身は省略
   */
  
if (!count($error_message)) {
    
// 内容の改行を<br>タグに変換する
    
$body str_replace(array("\r\n""\r""\n"), "<br>"$body);
    
$schedule_date sprintf("%04d%02d%02d"$year$month$day);
    
$new_line $schedule_date."|".$title."|".$body."\n";
    if (isset(
$_POST["lineno"])) {
      
$schedule_list file($filename);
      
$fp fopen($filename"w");
      foreach (
$schedule_list as $lineno => $original_line) {
        if (
$lineno == $_POST["lineno"]) {
          
fwrite($fp$new_line);
        } else {
          
fwrite($fp$original_line);
        }
      }
      
fclose($fp);
    } else {
      
$fp fopen($filename"a");
      
fwrite($fp$new_line);
      
fclose($fp);
    }
    
header("Location: http://localhost/schedule_list.php");
    exit;
  }
} elseif (isset(
$_GET["mode"]) && $_GET["mode"] == "delete") {
  
$schedule_list file($filename);
  
$fp fopen($filename"w");
  foreach (
$schedule_list as $lineno => $original_line) {
    if (
$lineno == $_GET["lineno"]) {
      
// 何も書き込まない
    
} else {
      
fwrite($fp$original_line);
    }
  }
  
fclose($fp); 

  
header("Location: http://localhost/schedule_list.php");
  exit;
} else {
  
/**
   * 初回読み込み時の、初期化処理
   * 中身は省略
   */
}
?>
<!-- 以下、表示部分。 -->
  • この中の、編集と削除のロジックがほとんど同じだった。
  • ユーザー定義関数を勉強したのは、ここを関数で一つにまとめるためでしたよね。
  • うんうん。この部分を一つの関数としてまとめることにしよう。できるかな?
  • よぅし。。(カタカタ)。。。う・・・引数とか、どうやって決めるんだろう。。。
  • この辺は、慣れないと少し難しいかもね。どれどれ、ちょっと僕がやってみようか(カタタタ)。。できた☆
<?php
if (isset($_POST["regist"])) {
  
/**
   * ボタンが押された後の、バリデーション
   * 中身は省略
   */
  
if (!count($error_message)) {
    
// 内容の改行を<br>タグに変換する
    
$body str_replace(array("\r\n""\r""\n"), "<br>"$body);
    
$schedule_date sprintf("%04d%02d%02d"$year$month$day);
    
$new_line $schedule_date."|".$title."|".$body."\n";
    if (isset(
$_POST["lineno"])) {
      
schedule_edit($filename$_POST["lineno"]);

  } else {
      
$fp fopen($filename"a");
      
fwrite($fp$new_line);
      
fclose($fp);
    }
    
header("Location: http://localhost/schedule_list.php");
    exit;
  }
} elseif (isset(
$_GET["mode"]) && $_GET["mode"] == "delete") {

  
schedule_edit($filename$_GET["lineno"]);

  
header("Location: http://localhost/schedule_list.php");
  exit;
} else {
  
/**
   * 初回読み込み時の、初期化処理
   * 中身は省略
   */
}



function 
schedule_edit ($filename$linenumber) {
  
$schedule_list file($filename);
  
$fp fopen($filename"w");
  foreach (
$schedule_list as $lineno => $original_line) {
    if (
$lineno == $linenumber) {
      if (isset(
$_GET["mode"]) && $_GET["mode"] == "delete") {
        
// 何も書き込まない
      
} else {
        
fwrite($fp$GLOBALS["new_line"]);
      }
    } else {
      
fwrite($fp$original_line);
    }
  }
  
fclose($fp);
}
?>
  • ほぅほぅ。。。こうなるのかぁ~。
  • じゃあ、ちょっと説明していこうか。関数にまとめる前の編集と削除のロジックを見比べると、違うのは$_POST["lineno"]と$_GET["lineno"]の部分と、実際に編集( fwrite($fp, $new_line);)、削除(// 何も書き込まない)を行っている部分の2箇所だ。
  • ふむ~。
  • そこでまず、作成した関数では、$_POST["lineno"]や$_GET["lineno"]を使っていた部分を$linenumberという関数の引数に置き換えてしまって、柔軟に対応できるようにしたんだ。
  • なるほど~。その次にあるif文は、$_GET["mode"]を使って編集と削除を区別するようにしたんですね。
  • その通り。$_GETはスーパーグローバル変数だから、関数の中でも何も気にせず使えるんだ。
  • もともと$new_lineという変数だった部分も、$GLOBALSに置き換わってる。。。
  • うん。$new_lineは元々このロジックの外で使っていたから、 グローバルスコープの変数なんだ。そこで、関数の中でも同じものを使用するために$GLOBALS変数を使ってみたよ。
  • ふむふむ。こうやってまとめると、コードの量が少なくなってすっきり見えるわ☆
  • そうだね。共通なロジックを関数にまとめることでコードの量が減るし、正しく書けば処理のブロックごとの切り分けがしやすくなるからコードの可読性も上がるんだ。
  • へぇ~。いい事尽くめだぁ。
  • うん。でも、注意しなければいけないこともあるよ。今はまだ詳しく説明しないけど、あまり無理に複雑な処理をまとめたり、グローバル変数をやたらと使いすぎたりすると、逆に後で読み返したときにわけがわからなくなる事があるんだ。
  • えぇ。。。なんかややこしい話ですね。
  • そういった事も、もうすこし上達してきた頃にきちんと話をしよう。今はまず、プログラムを作ることに慣れる事が大事だよ。
  • はーい。
  • 1
  • 2

  



Pick Up Q&A

Q
負荷時のmysql_connect()エラー
 このエントリーをはてなブックマークに追加 
A
これはPHPというよりOSまたはMySQLのコミュニティで質問されたほうがいいと思います。 ぱっと思いついた範囲で記すと MySQL等のDBに「ある時点において同時に接続可能なクライアントの最大数」に制限があるよう...

>>続きを読む

今回のような実践的な経験がエンジニアのキャリアに繋がると思います。是非サービスを成功させて下さい!

▲解説者:岡本(アシアル株式会社 教育コーディネーター兼 システムエンジニア)