オブジェクト指向というとJavaを思い浮かべるかもしれませんが、PHPでも使うことができます。今回はWindowsのローカル環境に構築したPHPでオブジェクトプログラミングをするにはどうしたらよいのかを紹介します。
環境
以前に記事にしたこちらのPHP環境を使います。
WindowsのPHPでHello World! | Naokix.net
WordPressを使っている人はローカルにXAMPPが入っていると思うので、その中に入っているPHPフォルダに環境変数のパスを通して流用することができます。
クラスの宣言
PHPでのクラスの書式は次のようになります。
1 2 3 | class (クラス名) { } |
簡単なソースコードを見てみましょう。文字コードはUTF-8、BOMなしです。
1 2 3 4 5 6 7 8 9 10 11 12 | <?php class hoge { private $text = "テスト。"; public function test() { echo $this->text."\n"; } } $obj = new hoge(); $obj->test(); |
つい$obj->$test();と書いてしまいそうになりますが、エラーが出るので注意してください。
動作するのか確認します。
クラスを別ファイルに切り離す
ひとつのPHPファイルが長くなってくると、クラスだけを別ファイルに切り離したくなるかもしれません。test.phpとhoge.phpというファイルを作成して同じフォルダに置きます。
まずはhoge.php。
1 2 3 4 5 6 7 8 9 | <?php class hoge { private $text = "テスト。"; public function test() { echo $this->text."\n"; } } |
次にこれを呼び出す側のtest.phpを作成します。
1 2 3 4 5 6 | <?php require_once(dirname(__FILE__) . '/hoge.php'); $obj = new hoge(); $obj->test(); |
dirname(__FILE__)は実行しているPHPファイルの親フォルダのパスを取得できますが、末尾にスラッシュが付いていません。require_onceの第2引数の頭にスラッシュを付け忘れないでください。
さらに、ファイルが増えてくるとフォルダで分類したくなるかもしれません。testフォルダの中にhoge.phpが入っていると思ってください。
その場合にはtest.phpの3行目を次のように変更します。
1 2 3 4 5 6 | <?php require_once(dirname(__FILE__) . '/test/hoge.php'); $obj = new hoge(); $obj->test(); |
コメントを書きましょう
クラスごとにPHPファイルを作成した場合、ファイルの冒頭やメソッドにコメントを記述することをおすすめします。1ヶ月前に書いたコードは他人が書いたもの同然です。
PHPライブラリを提供するサービスPEARにはAPIドキュメントを自動生成してくれる「PHPDocumentor」というツールがあります。PHPにコメントを記述する場合にはこのツールの書式にならうのが一般的なようなので、どのように書いたらよいのかをまとめておきます。
コメントの基本
PHPにおいてコメントを記述するには、行の最初に次のように記述します。
1 | //(この行はコメントになる) |
複数行をコメントとして扱いたいのなら、次のように記述してください。
1 2 3 4 5 | /* (コメントが閉じられるまですべての行がコメントです) (この行も) (この行もコメントになっちゃいます) */ |
phpDocumentorの記述ルール
/**からはじめます。行の先頭に*が必要で、これがない行は無視されます。//ではDocCommentにはならないことに注意してください。
1 2 3 4 5 6 7 | /** * * * (コメントを書きます) * * */ |
実際にどのように記述するのか、例を挙げてみます。
ファイルの先頭
DocCommentでは@ではじまる「タグ」を使ってコメントを記述していきます。
1 2 3 4 5 6 7 8 9 10 | <?php /** * ファイルの説明をします。目的などを簡潔に。 * 詳細な説明は各メソッドに任せましょう。 * * @copyright:Copyright (C) 2017 Naokix.net All Rights Reserved. * @license :https://opensource.org/licenses/mit-license.html MIT License * @author :Naokix <naokix03199@yahoo.co.jp> * @link :(参考にしたURLなど) */ |
@authorで<>に囲まれた部分はメールアドレスと認識されるので、連絡先などを記述しておくとよいでしょう。
クラス
1 2 3 4 5 6 7 8 9 10 11 12 | /** * クラスの説明をします。 * * 1行空けてもう少し詳しく記述できます。 * 複数行の記述が可能。省略もできます。 * * @copyright:Copyright (C) 2017 Naokix.net All Rights Reserved. * @author :Naokix <naokix03199@yahoo.co.jp> * @access :アクセスレベル * @category :カテゴリー(処理系) * @package :パッケージ(MVC) */ |
メソッド
1 2 3 4 5 6 7 8 9 10 11 | /** * メソッドの説明をします。 * * 1行空けてもう少し詳しく記述できます。 * 複数行の記述が可能。省略もできます。 * * @param int $id * @param string $name * @return array|bool * @throws (メソッドが発行する例外オブジェクト) */ |
@paramの書式ですが、
1 | @param 型 パラメーター名 |
のように記述します。
@returnではいくつかの型を返すメソッドの場合、mixedと書くこともできるのですが、これは避けたほうがよさそうです。配列を返すメソッドが配列を取得できずにfalseを返すような仕様だった場合にエラーを引き起こします。
@throwsを記述しておくと、メソッドを呼ぶ側がどのようなtry~catchを書くべきかを判断できるようになります。こちらの受け売りです。
命名やリファクタリングでメンテナンスの効率を上げる
オブジェクト指向プログラミングにのっとってリファクタリングをすると、どうしてもサイズの小さなファイルが増えてしまいます。これを嫌う人がいますが、わかりやすくて効果的な命名と組み合わせることでソースコードが理解しやすくなり、メンテナンス性が向上します。
オブジェクト指向はわかりにくいとよく言われますが、慣れてしまえばかなり便利なものなので積極的にクラスを活用するようにしてみてください。
Comment