PHPのclass、オブジェクト指向プログラミングに関する質問です。


PHPを独学で勉強しているのですがclassに関しては全く手を付けていません。
理由として「メリットがイマイチ理解できない」からです。


もちろん使ったほうが何らかのメリットはあると思うのですが、具体的にどのようなメリットがあるのか教えて頂けないでしょうか。

抽象的な表現で「~~なメリットがある」というのは検索するとたくさん出てきますので、もう少し具体的な情報が欲しいです。

コードが少なくなるのならば、具体的にどのような状況下で少なくなるのか、そういったところまで伺いたいです。

PHPだとありがたいですが、他の言語でも構いません(ポイントはPHPに優先的に配分するかもしれません)

よろしくお願いします。

回答の条件
  • 1人3回まで
  • 登録:2007/08/24 22:33:54
  • 終了:2007/08/31 22:35:04

回答(6件)

id:KUROX No.1

KUROX回答回数3542ベストアンサー獲得回数1402007/08/25 00:26:22

ポイント19pt

1.自作のロジックを関数化して再利用できることは

  便利だと実感できる?

2.上記の関数を集めて、モジュール化することは、

  便利だと実感できる?

3.変数のスコープに関して不便を感じたことはあるか?

4.変数とモジュールがワンセットになってるほうが

  便利だと実感できる?

5.構造体(PHPにはない?)のようにある意味を持った

  変数の集合体を便利だと実感できる?

6.コーディングしてて、このままでは次回読み直しても

  分からないだろうと思うことがある?

7.複数人で1つのものを作るときにどのように作業分担

  したらトラブルがするないかはどう考えるか?

一番の問題は、コーディングしてて、スパゲティー状態に

陥って泥沼にはまること。一回出来上がったのはいいが

もう二度と機能追加できないようになってること。

まあ、そうならないようにしましょうということで

上記の7つの経験より出てきた概念です。

構造体の概念が分かるなら、構造体に関連関数がついたものが

クラスです。

モジュールが概念として分かるなら、関連する変数をつけた

ものがクラスです。

クラスをどう使ってるかを、実際使われている掲示板等の

PHPのソースをみて、解析してなるほどと思わないと

誰が説明してもわからないと思います。

上記の7つがなんとなく分かるなら、そのうちわかると思います。

id:ktoshi No.2

ktoshi回答回数107ベストアンサー獲得回数62007/08/25 00:31:43

ポイント19pt

以下がクラスのメリットの一部分と個人的な意見です。。

・クラスが違えばメソッド名を使い回せる。(ユーザー関数の場合、同じ名前の関数を作れない)

・関連する機能をまとめられる。

・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情報を削除する処理
	}
}
?>
id:tokyosmash

具体的にコードを記述していただきありがとうございます。このように具体例を出してもらえると勉強しやすいです。


もしこれから回答いただける場合は、このように何か具体的な例を挙げてもらえると助かります。質問文にも書いてありますが、抽象的な説明はなかなか理解しづらいのです。


よろしくお願い致します。

2007/08/26 20:30:32
id:Yota No.3

Yota回答回数453ベストアンサー獲得回数282007/08/25 09:02:57

ポイント18pt

クラス(オブジェクト指向)のメリットについては、上の方で縷々述べられていると思うので、繰り返しません。

PHP5から本格的なオブジェクト指向に対応したので、オブジェクト指向でプログラミングをしてきた人が、お引越しするにはよくなっていると思います。

ところで、わたし自身はクラスなるものをPHPでほとんど作ったことがありません。再利用するかどうか確信がないうえ、手続き通り書いた方が速いからです。頭が悪くて、クラスを構築するのに時間がかかりすぎというだけかもしれませんが。

ところが、人の書いたコードやPEARなどのライブラリを利用しようとすると、よくclassを作ってあります。これをカスタマイズしなければならないことがままあります。そのときクラスの仕組みがわかっていないと、「だるま」さんのように手も足も出なくなってしまいます。

以上のような理由で、いつもいつもクラスを作らなくてもいいが、たまに忘れないために作った方がいいと思います。それと人に見られたとき、本格的プログラムみたいでかっこいいです。

id:KUROX No.4

KUROX回答回数3542ベストアンサー獲得回数1402007/08/25 12:32:52

ポイント18pt

オブジェクト指向(クラス)といえば商売できる時代が

あったので、誇大広告気味なところはあります。

デザインパターンの適用ができるというのは、

クラスを使ってるからこそのメリットであり

アルゴリズムの解決方法だと思います。

デザインパターンを少し勉強されたらどうでしょうか?

id:okinaka No.5

okinaka回答回数38ベストアンサー獲得回数12007/08/26 18:51:28

ポイント18pt

私にとってオブジェクト指向の真髄は、インターフェースです。

それ以外はおまけだったりします。

これが理解できれば、オブジェクト指向の良さがわかると思います。

具体例が欲しいとのことですが、そういうときは

他のひとがつくったソースコードを読むことをおすすめします。

ただPHPは、オブジェクト指向に作らなくても十分動く代物なので、

なかなかいい材料はないと思います。

Java などのより本格的なオブジェクト指向言語のものを

参考にするとよいでしょう。

どうしてもPHPにこだわるならデザインパターン本のサンプルコードなども参考になるのではないかな。

http://www.amazon.co.jp/PHP%E3%81%AB%E3%82%88%E3%82%8B%E3%83%87%...

id:tokyosmash

回答ありがとうございます。

もちろん他の人が作ったソースはたくさんあるのですが、何から読めばいいのかわからなかったので質問させてもらいました。

確かにPEARなどを導入してみるとオブジェクト指向というものが随所に出てきます。ただ、あまりにも規模が大きいので追いかけるのが大変なのです。

質問文にも書きましたが、抽象的な表現ではなかなか理解しづらいのが正直なところです。

2007/08/26 20:32:38
id:okinaka No.6

okinaka回答回数38ベストアンサー獲得回数12007/08/29 22:59:44

ポイント18pt

インターフェースを利用することで、ロジックの交換が可能に

なる点が素晴らしいと思います。

ちょっと冗長なプログラムですが、以下のようなサンプルを作ってみました。

<?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種類ですが、同じインターフェースのクラスを増やせばそれだけ種類も増やせます。

  • id:tokyosmash
    追記です:
    http://q.hatena.ne.jp/1150196640
    こちらに同じような質問があるのですが、やはり抽象的なものが多いので理解しづらいです。
  • id:tokyosmash
    自分で使うためのちょとしたシステムを作っているのですが、だんだんと規模が大きくなってきたので今後保守が大変になりそうです。

    オブジェクト指向で作ればもっと洗練されてコードも少なくなるような気がします。ただ、具体的にどう洗練されるのかがイメージできないのです。

    ちなみにPHP5とMySQL5で、Pearは多用してます。
    フレームワーク等は一切使っていません。
    Smartyも使っていませんが、MVCを意識してMVCは切り離しているつもりです。


    ちなみに上記の質問内のこちらは参考になりました。

    ----------------------------------------------
    クラスの利点としては、再利用性が大きな利点だと私は考えています。

    >>フリーのスクリプトを少しいじれる程度のスキル

    との事ですが、正直最初はクラスに関してはあまり考えなくて良いかも知れません。

    自分で、全てのソースを書くようになってきて「なんか、同じようなソース何回も書いてるな~」と思ったら、そこがオブジェクト指向を取り入れるべき時点です。

    その何度も書いているソースを一度だけ書けば再利用できるように作り上げるのがクラスであったりオブジェクト指向であるととりあえずは考えてよいでしょう。
    ------------------------------------------------
    概念よりも実例から理解する思考回路のようで、もう少し具体的なコードがあれば俄然理解も進むと思ってます。



    長い追記になりましたがよろしくお願いします。また何か追記するかもしれません。
  • id:ktoshi
    再利用について


    例えば、はてなでは「はてな認証API」を提供しています。
    その「はてな認証API」を簡単に利用できるようにライブラリとして提供してくれている人もいます。
    もしこのようなライブラリを提供してくれる人がいなければ、みんながみんな「はてな認証API」を利用するコードを書かなければなりません。提供してくれるのでみんなで利用(再利用)できます。

    規模を小さくしてみましょう。
    自分がよく使ったり、作成しているプログラムで頻繁に同じような処理をするのであれば、クラスとしてまとめて必要なときに呼び出せるようにしておけるようにしておいくと便利だよ、ということと思います。

  • id:tokyosmash
    みなさん回答ありがとうございます。
    腰を据えて読んでから返答したいと思いますので、しばらく空白のままになりますがご了承下さい。

この質問への反応(ブックマークコメント)

トラックバック

  • part1 PHPでOOP (PukiWiki/TrackBack 0.4) 2008-02-05 13:05:43
    http://pc11.2ch.net/test/read.cgi/php/1172205352/ PHPでOOP --> ■掲示板に戻る■ [ DAT ], [ 元スレ ], [ 最新50 ] 101 KB PHPでOOP 1 :1 ◆SWtzLesEmM :2007/02/23(金) 13:35:52 ID:??? PHPを使ってプログラミングする
「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません