PHP
phpもくもく会

phpもくもく会 08回

More than 5 years have passed since last update.

今日やること

  1. 先週までのおさらい
  2. クラスの練習
  3. お問い合わせアプリを構造化する
  4. Githubプロジェクトを作ってタグをつける

先週までのおさらい

  1. php開発を行うための基礎知識をさらーっと学び
  2. HTTP通信について学び
  3. データベースの扱い方についてちょろっと学び
  4. お問い合わせフォームを実装
  5. リファクタリングの方法や手段について学んだ

ざっくり書くとこんな感じです。
クラスはリファクタの手段の1つです。

前回クラスの理解が難しそうと感じたので、
軽くクラスの練習をします。

クラスの練習

例題:Fishクラス

主に食用の魚を表現するクラスです

  1. クラス名:Fish
  2. コンストラクタ
    1. 引数:name, color, price
  3. プロパティ
    • パブリック
      1. name: 魚の名前
      2. color: 赤身 or 白身
    • プライベート
      1. price: 1匹あたりの値段
  4. メソッド(全てパブリック)
    • getPrice: 引数なし、魚の値段(price)を返す
    • isWhite: 引数なし、白身魚ならtrue, 赤身ならfalseを返す
<?php
class Fish {
    public $name;
    public $color;
    private $price;

    function __construct($name, $color, $price) {
        $this->name = $name;
        $this->color = $color;
        $this->price = $price;
    }

    public function getPrice() {
        return $this->price;
    }

    public function isWhite() {
        return $this->color === "白身";
    }
}

$sanma = new Fish('さんま', '白身', 300);

echo $sanma->getPrice()."\n";   // 300
echo $sanma->isWhite()."\n";    // 1(true)

FishPackクラス

パック詰めされた魚を表現するクラスです。上のFishクラスと連携します。

  • クラス名:FishPack
  • コンストラクタ
    • 引数:fishes(Fishクラスのインスタンスの配列)
  • プロパティ
    • プライベート
      • fishes:パックに入っている魚の一覧(配列)
  • メソッド
    • howMuch: 引数なし。消費税(1.05)を魚の合計の値段にかけて、小数点以下は切り捨てして返す
<?php
class FishPack {
    // ...
}

$packA = new FishPack(array(
    new Fish('アジ', '白身', 120),
    new Fish('アジ', '白身', 120),
));
$packB = new FishPack(array(
    new Fish('アジ', '白身', 120),
    new Fish('さんま', '白身', 300),
    new Fish('まぐろ', '赤身', 450),
));

echo $packA->howMuch()."\n";    // 252
echo $packB->howMuch()."\n";    // 913

Pokemonクラス

個体値・努力値・性格を入れても作業量増えるだけなのではしょります。

  1. クラス名:Pokemon
  2. コンストラクタ
    1. 引数:id(数字), name(文字列), lv(数字), statuses(連想配列)
  3. プロパティ
    • パブリック
      1. id: ずかんID
      2. name: ポケモンの名前
    • プライベート
      1. lv: レベル
      2. baseStatus: 種族値
        1. H: HP
        2. A: こうげき
        3. B: ぼうぎょ
        4. C: とくこう
        5. D: とくぼう
        6. S: 素早さ
  4. メソッド(全てパブリック)
    • summary: 引数なし、ずかんIDと名前、LVを文字列で返却する(例:LV50 1/フシギダネ
    • calcStatus: 引数なし、LVと種族値を元にステータスを計算する
      • H, A, B, C, D, Sのキーを持つ連想配列を返す!
      • ※ステータス計算式
        • HP: (種族値 * 2) * (LV / 100) + 10 + LV
        • その他: (種族値 * 2) * (LV / 100) +5
<?php
$hushigidane = new Pockemon(1, 'フシギダネ', 50, array(
    'hp' => 45,
    'attack' => 49,
    'defense' => 49,
    'spAtack' => 65,
    'spDefense' => 65,
    'speed' => 45,
));

var_dump($hushigidane->calcStatus());

お問い合わせアプリを構造化する

ディレクトリ構造はこんな感じ

inquiry/
├── classes
│   ├── auth.php
│   └── inquiry.php
├── lib
│   ├── db.php
│   └── util.php
├── admin
│   ├── auth.php
│   ├── delete.php
│   ├── edit.php
│   ├── index.php
│   └── login.php
├── complete.php
├── config.php
├── confirm.php
├── form.php
└── index.php

この構造の理由

  1. ユーザ名やパスワードは設定ファイルに書く(config.php)
  2. 表示用ファイルと処理を行う部分をきっちり分ける
    1. 表示用ファイルで必要なファイルをrequireする
    2. ライブラリファイルは単体では何も出力しない(定義だけする)
  3. データベースでわちゃわちゃする部分を、表示用ファイルに書かない
    1. 表示用のコードがなるべくシンプルになるようにlib/classes/を用意
    2. lib/は、データベース関連(db.php)と、その他リダイレクト等の便利関数(util.php)を書く
    3. classes/はデータベースの処理を更に簡潔に書けるよう包んだもの

例(管理画面トップ)

admin/index.php
<?php
// 設定、Authクラス、Inquiryクラス、ユーティリティを読み込む
require_once dirname(__FILE__).'/../config.php';
require_once dirname(__FILE__).'/../classes/auth.php';
require_once dirname(__FILE__).'/../classes/inquiry.php';
require_once dirname(__FILE__).'/../lib/util.php';

// デバッグ用に強制ログイン
Auth::setUser('hogehoge');

// ログインしてなかったらログイン画面へリダイレクト
if(! Auth::isLogin()) {
    Util::redirect_to('/admin/login.php');
}

// お問い合わせの内容を全件出力
var_dump(Inquiry::findAll());
?>

上のディレクトリ構造をダウンロード

いちいち作ってもらうのも面倒なので、ダウンロードして書き進める形で。

ちょろっと骨組みが書いてあります。
http://d.pr/f/YuUU

Githubプロジェクトを作ってタグをつける

githubにリポジトリを作成

  1. Github https://github.com にログイン
  2. 新しいリポジトリを作成
    1. Repository name:inquiry
    2. Description:このアプリケーションの説明文
    3. Public, Private:public
    4. Initialize...:チェックしない

GitHub.png

リポジトリ画面の説明
Leko_pizza-workflow.png

github for macをダウンロード

githubicon.png

GitをGUIから使えるアプリ
http://mac.github.com/

ダウンロードしたら起動して、アプリ内でGithubにログイン

Githubに作ったリポジトリをクローンする

ブラウザでリポジトリのページを開いて、Clone in Desktopをクリック

Leko_pizza-workflow.png

アプリが起動するので、保存場所を指定して保存。
※どこに保存しても良いけど、絶対Dropboxの内部には入れないこと

以降、保存したそのフォルダをローカルリポジトリと呼ぶ

画面の説明(ざっくり)

全画面_2013_11_13_18_57.png

initial commit

先ほどダウンロードしたものの中身を丸ごとぶち込む
すると変更されたファイルのところに色々追加されると思うので、全てチェックして、
Commit summaryのところにinitial commit(初のコミット)と書いてコミットボタンを押す

これで最低限の準備が完了。

とりあえずお試しでREADMEを作成

このリポジトリを発見した人向けに説明を書いておきましょう

README.mdというファイルを作成して、以下を貼り付け

Markdownという書き方で書いています。興味があれば調べてみて下さい。

README.md
# inquiry
お問い合わせフォームとそのお問い合わせの管理ができるアプリケーション。
PHPの勉強のために作りました。

※公開する予定は今のところありません。ローカルでの実行を想定しています

## 実行環境
|項目|使用してるもの|
|---|---|
|サーバ|apache|
|データベース|MySQL|
|言語|PHP|
|フレームワーク|不使用|

コミットしてみる

Githubアプリを開くと、new README.mdと書かれているはず。
そいつをチェックして、コミットタイトルを書いて、コミットボタン。

コミットタイトル?

今からするコミットが、何を追加変更したのかを書く

プッシュしてみる

メニューからプッシュを選択
ブラウザでリポジトリのページを開くと、今書いたREADMEの内容が反映されている

tagを付けて現状を保存

ざっくり言うと、20131113_inquiry.zipと同じこと
その時点での状態をダウンロード可能な安定版として保存しておける

ブラウザのリポジトリのページを開いて、
タグ一覧をクリックして、タグを作成。

時間があれば

9割以上が既に動いているコードを分割・結合するだけだと思うので、
以前作ったお問い合わせアプリを今回作ったバージョンに書き直す