2014年11月29日土曜日

引き続きPHPの勉強です

※ ソースコードを見やすくするために、Syntaxhilighterを使っています。状況によって表示に時間がかかる場合があります。

引き続きPHPの勉強をしています。今日はネット上で見つけた次のリンクを使いました。
「PHPコードではなくPHPコードの「書き方」を知る」を発表してきました」


オブジェクト指向はクラスの使用とともに教科書的な勉強はしてきましたが、とても簡単な練習問題を使いながらもそのポイントが改めて理解できる、良い講義でした。

例えば1から20の自然数において、基本はその数字を表示させるのですが、FizzBuzzという3で割り切れる数にはFizz、5で割り切れる数にはBuzz、両方で割り切れる数にはFizzBuzzで置き換えるというものです。

私の始めのコードも注文通り、入力部と出力部のコードがごっちゃになったものでした(笑)。



for ($i = 1; $i <= 20; $i++) {
 if ($i % 3 === 0 && $i %5 === 0) {
  echo 'FizzBuzz' . PHP_EOL;
 } elseif ($i % 3 === 0) {
  echo 'Fizz' . PHP_EOL;
 } elseif ($i % 5 === 0) {
  echo 'Buzz' . PHP_EOL;
 } else {
  echo $i . PHP_EOL;
 }
}


これをレクチャーにしたがって、クラスを使いながら入力部と出力部を分離したのが次のものです。

class FizzBuzzClass
{
 public function evaluate($i)
 {
  if ($i % 3 === 0 && $i % 5 === 0){
   return 'FizzBuzz';
  } elseif ($i % 3 === 0){
   return 'Fizz';
  } elseif($i % 5 === 0){
   return 'Buzz';
  } else {
   return $i;
  }
 }
 
 public function output($sentence)
 {
  echo $sentence . PHP_EOL . "\n";
 }
}

// メインプログラム
require_once 'FizzBuzz.php';

$obj = new FizzBuzz();

for ($i =1 ; $i <+ 30; $i++) {
 $fizzbuzz = $obj->evaluate($i);
 $obj->render($fizzbuzz);
}


レクチャでは上記の内容で終わりですが、個人的にクラスの中で配列を使ったコードが作れないか試してみました。

少々自信がないのですが、クラスのプロパティの変数としてPrivateな配列を作り、その配列を使ってFizz、Buzzを入れ込みたかったのですが、結局うまくいきませんでした。

private $array_out = range(1,30,1) と定義しようとするとエラーとなってしまうのです (PHP5.4)。

強引にやる方法はありそうなのですが、基本はクラスのプロパティの変数として配列を定義することはあまり正統ではないようです。(すみません、間違っている可能性も高いので、その場合にはアドバイスいただけるとありがたく) 。

Methodとして関数の中で定義してあげるとうまくいくので、とりあえずそうしています。


/**
 * Define FizzBuzzClass
*/

class FizzBuzzClass
{
 // FizzBuzzの判定
 // 1から30までの配列を作り、判定結果を配列要素として返す。
 public function evaluate(){
  $array_out = range(1,30,1);
  foreach ($array_out as &$value) {
   if ($value % 3 === 0 && $value % 5 === 0){
    $value = 'FizzBuzz';
   } elseif ($value % 3 === 0){
    $value = 'Fizz';
   } elseif($value % 5 === 0){
    $value = 'Buzz';
   } else {
    $value = $value;
   }
  }
  return $array_out;
  unset($value);

 // ブラウザへの書き出し
 public function display($array_out) {
  foreach ($array_out as $value) {
   echo $value . PHP_EOL . "\n";
  }
 }
}

// メインのプログラム
$obj = new FizzBuzzClass();
$arr = $obj->evaluate();
$obj->display($arr);


0 件のコメント:

コメントを投稿