PHPを独学で勉強しているのですがclassに関しては全く手を付けていません。
理由として「メリットがイマイチ理解できない」からです。
もちろん使ったほうが何らかのメリットはあると思うのですが、具体的にどのようなメリットがあるのか教えて頂けないでしょうか。
抽象的な表現で「~~なメリットがある」というのは検索するとたくさん出てきますので、もう少し具体的な情報が欲しいです。
コードが少なくなるのならば、具体的にどのような状況下で少なくなるのか、そういったところまで伺いたいです。
PHPだとありがたいですが、他の言語でも構いません(ポイントはPHPに優先的に配分するかもしれません)
よろしくお願いします。
1.自作のロジックを関数化して再利用できることは
便利だと実感できる?
2.上記の関数を集めて、モジュール化することは、
便利だと実感できる?
3.変数のスコープに関して不便を感じたことはあるか?
4.変数とモジュールがワンセットになってるほうが
便利だと実感できる?
5.構造体(PHPにはない?)のようにある意味を持った
変数の集合体を便利だと実感できる?
6.コーディングしてて、このままでは次回読み直しても
分からないだろうと思うことがある?
7.複数人で1つのものを作るときにどのように作業分担
したらトラブルがするないかはどう考えるか?
一番の問題は、コーディングしてて、スパゲティー状態に
陥って泥沼にはまること。一回出来上がったのはいいが
もう二度と機能追加できないようになってること。
まあ、そうならないようにしましょうということで
上記の7つの経験より出てきた概念です。
構造体の概念が分かるなら、構造体に関連関数がついたものが
クラスです。
モジュールが概念として分かるなら、関連する変数をつけた
ものがクラスです。
クラスをどう使ってるかを、実際使われている掲示板等の
PHPのソースをみて、解析してなるほどと思わないと
誰が説明してもわからないと思います。
上記の7つがなんとなく分かるなら、そのうちわかると思います。
以下がクラスのメリットの一部分と個人的な意見です。。
・クラスが違えばメソッド名を使い回せる。(ユーザー関数の場合、同じ名前の関数を作れない)
・関連する機能をまとめられる。
・1クラス1ファイルとして保存してみると機能ごとにファイルが分かれているのでデバッグ時に探しやすい。
・コードの見た目がすっきりする。
以下のよう書き方になると思うのですが、すっきりした感じがしませんか?しないかな・・・例えが悪いかな。
わたしも勉強中です。関数中心でプログラムするのでも問題ないと思いますが、クラスライブラリ(PEARなど)は使うようになるでしょうからクラスの基本的なことは勉強しといた方が良いと思います。
./index.php <?php include_once('Authors.php'); include_once('Books.php'); $a = new Authors; $authors = $a->Data(); // 著者情報を取得 $b = new Books; foreach($authors as $key => $author) { echo '<h2>著者:'.$author['author'].'<h2>'; $books = $b->Data($author['id']); // 著者別の著作物を取得 foreach($books as $key => $book) { echo $book['title'].'<br>'; } } ?> ./Authors.php <?php /** * Authors テーブルを操作 */ class Authors { function Authors() {} function Data() { $result = pg_query($conn, "SELECT id, author, email FROM authors"); while ($row = pg_fetch_row($result)) { $data[] = $row; } return $data; } function Save($id = null, $author, $email) { if($id) { pg_query($conn, "UPDATE authors set author='{$author}', email='{$email}' WHERE id='{$id}'"); }else{ pg_query($conn, "INSERT INTO authors (author, emai) values ($author,$email); } } function Delete($id) { pg_query($conn, "DELETE FROM authors WHERE id='{$id}'); } } ?> ./Book.php <?php /** * Books テーブルを操作 */ class Books { function Books() {} function Data($id) { $result = pg_query($conn, "SELECT id, title, date FROM books WHERE id='{$id'}"); while ($row = pg_fetch_row($result)) { $data[] = $row; } return $data; } function Save() { // AuthorsクラスでもSaveというメソッドがあるが問題なし。 Book情報を更新または追加する処理 } function Delete() { Book情報を削除する処理 } } ?>
クラス(オブジェクト指向)のメリットについては、上の方で縷々述べられていると思うので、繰り返しません。
PHP5から本格的なオブジェクト指向に対応したので、オブジェクト指向でプログラミングをしてきた人が、お引越しするにはよくなっていると思います。
ところで、わたし自身はクラスなるものをPHPでほとんど作ったことがありません。再利用するかどうか確信がないうえ、手続き通り書いた方が速いからです。頭が悪くて、クラスを構築するのに時間がかかりすぎというだけかもしれませんが。
ところが、人の書いたコードやPEARなどのライブラリを利用しようとすると、よくclassを作ってあります。これをカスタマイズしなければならないことがままあります。そのときクラスの仕組みがわかっていないと、「だるま」さんのように手も足も出なくなってしまいます。
以上のような理由で、いつもいつもクラスを作らなくてもいいが、たまに忘れないために作った方がいいと思います。それと人に見られたとき、本格的プログラムみたいでかっこいいです。
オブジェクト指向(クラス)といえば商売できる時代が
あったので、誇大広告気味なところはあります。
デザインパターンの適用ができるというのは、
クラスを使ってるからこそのメリットであり
アルゴリズムの解決方法だと思います。
デザインパターンを少し勉強されたらどうでしょうか?
私にとってオブジェクト指向の真髄は、インターフェースです。
それ以外はおまけだったりします。
これが理解できれば、オブジェクト指向の良さがわかると思います。
具体例が欲しいとのことですが、そういうときは
他のひとがつくったソースコードを読むことをおすすめします。
ただPHPは、オブジェクト指向に作らなくても十分動く代物なので、
なかなかいい材料はないと思います。
Java などのより本格的なオブジェクト指向言語のものを
参考にするとよいでしょう。
どうしてもPHPにこだわるならデザインパターン本のサンプルコードなども参考になるのではないかな。
http://www.amazon.co.jp/PHP%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%...
回答ありがとうございます。
もちろん他の人が作ったソースはたくさんあるのですが、何から読めばいいのかわからなかったので質問させてもらいました。
確かにPEARなどを導入してみるとオブジェクト指向というものが随所に出てきます。ただ、あまりにも規模が大きいので追いかけるのが大変なのです。
質問文にも書きましたが、抽象的な表現ではなかなか理解しづらいのが正直なところです。
インターフェースを利用することで、ロジックの交換が可能に
なる点が素晴らしいと思います。
ちょっと冗長なプログラムですが、以下のようなサンプルを作ってみました。
<?php class CSVFormatter { function format($arr) { $s = ""; $is_head = true; foreach ($arr as $a) { if ($is_head) { $is_head = false; } else { $s .= ","; } $s .= $a; } return $s; } } class TSVFormatter { function format($arr) { $s = ""; $is_head = true; foreach ($arr as $a) { if ($is_head) { $is_head = false; } else { $s .= "\t"; } $s .= $a; } return $s; } } function get_formatter($t) { if ($t == "csv") { return new CSVFormatter(); } else { return new TSVFormatter(); } } // カンマ区切り $o = get_formatter("csv"); echo $o->format(array("a", "b", "c")) . "\n"; // タブ区切り $o = get_formatter("tsv"); echo $o->format(array("1", "2", "3")) . "\n";
get_formatter 関数から呼ばれたオブジェクトを使って同じ format メソッドの値を echo したけど、結果が違う。
初めのは「カンマ区切り」、もう片方は「タブ区切り」になります。
例としてあげたのは2種類ですが、同じインターフェースのクラスを増やせばそれだけ種類も増やせます。
具体的にコードを記述していただきありがとうございます。このように具体例を出してもらえると勉強しやすいです。
もしこれから回答いただける場合は、このように何か具体的な例を挙げてもらえると助かります。質問文にも書いてありますが、抽象的な説明はなかなか理解しづらいのです。
よろしくお願い致します。