プロが教える店舗&オフィスのセキュリティ対策術

プログラミング言語としては、PHPだけ、ある程度分かります。
職業プログラマではありません。
回答は、PHP4、5、どちらで回答して下さっても結構です。
両方について比較しながら回答して下さると、さらに嬉しいです。
(ver.4→ver.5で、オブジェクト指向がかなり強化されているようですね。)
私が使用しているPHPのバージョンは4.4.8です。
連携データベースはSQLite2.8です。
(MySQLの知識はありませんが、今後、勉強していく予定です。)

さて、本題に入りますが、

PHPにおいて、
クラスの書き方の作法については大体分かりました。
オブジェクト指向の考え方もある程度は頭に入っています。
ただ、このクラスというものが具体的にどういう時に役立つのか、今一つピント来ないので、
どなたか、その辺りを実際的かつ豪快に教えて下さい。

C言語やJAVAの参考書には、クラスの意義などがしっかり書かれているのかもしれませんが、
PHPの参考書には、なかなかそういった本が無さそうなので、このような質問をさせて頂きました。
(PHPの本は、10冊以上は読んでいると思います。)

回答の指針を以下に挙げておきますので、よろしければ参考にして下さい。

・クラスじゃないと表現できないスクリプト例。(内容を言葉で、または、コードで。)
・クラスを利用して便利だなぁと感じた瞬間。(同上)
・クラスを使わなかった場合に感じる不便さ、の例。(同上)
・クラスを使わず、ユーザ定義関数だけで対処することとの違い。(同上)
・逆に、クラスを使うことのデメリット。

-------------------
回答を頂きましたら、適宜、補足なりお返事をさせて頂きます。
以上、よろしくお願い致します。

A 回答 (3件)

とても単純なことだが、たとえばある程度の規模の開発をするとして、汎用的な機能を関数としてまとめると思う。

そのとき、ライブラリの中に300個の関数がずらっと並んでいる状態を想像してみてほしい。それと、10個ほどのメソッドを持ったクラスが30個ある状態を比べて、どっちがメンテナンスしやすいか想像してみてほしい。

関数というのは、あくまで「処理」をまとめたものだ。クラスは、処理と値をひとまとめにできる。つまり、クラスでは、ある機能について、それに必要な処理と、必要な値をすべて自身の中に保持し管理できる。重要なのは、その値と同じ名前の変数などがクラス外にあっても、まったく影響を与えないという点だ。

いくつもの機能があって、それぞれで数百の値を保持しながら動くようなプログラムを考えてみよう。それだけの変数を管理するのは、大変だろう。クラスならば、そのクラスに必要な値はすべてクラス内にパッケージングできる。「ええと、これの値はどこだ?」となれば、そのインスタンスからメンバ変数を取り出せばいい。

まぁ、たとえば、ハードディスクで「フォルダが作れないファイルシステム」を想像してみると、フォルダの重要性がわかると思う。このフォルダ=クラスとイメージしたらどうだろう?

クラスの利点は他にもいろいろあると思うが、まぁ一番直感的にわかりやすいという点ということで。

この回答への補足

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

>300個の関数がずらっと並んでいる状態
>10個ほどのメソッドを持ったクラスが30個ある状態

もちろん、1つの例として、読ませて頂きましたが、
300個のバラバラなユーザ定義関数を、10個ほどのメソッドを持ったクラス30個に統合できるような、
そんな使い方ができるのであれば、クラスの利用価値はあると私にも感じられます。

クラスを使用したことのない私には、300個のバラバラなユーザ定義関数を、30個のクラスにまとめるようなことが、
実際的に出来るのかどうか分からなかったので、今回このような意見を頂き、大変参考になりました。

>重要なのは、その値と同じ名前の変数などがクラス外にあっても、まったく影響を与えないという点

スコープ(グローバル、ローカル)のお話ですね。
メンバ変数、メソッド、それぞれの中身が意図しない所で変えられてしまうのをある程度防ぐ効果がありますよね。
また、スクリプトファイル内において、スコープのことさえしっかり意識できていれば、同一名の変数を重複して使うことができるので、
変数名を考える際の手間を低減することにもつながりますよね。
この点に関するメリットは私にも何となく分かります。

>ハードディスクで「フォルダが作れないファイルシステム」を想像してみる

それは不便ですね。
これと同じような不便があるのだとしたら、クラスを使わない手はないですね。

>クラスの利点は他にもいろいろあると思うが、まぁ一番直感的にわかりやすいという点ということで。

はい、回答頂いた点に関して、その点における利便性についてはよく分かりました。大変参考になりました。
ありがとうございます。

--------------
(補足)
「継承」を使うことで得られる具体的なメリットについて、気になっていたりします。
どなたか、この点についてクローズアップして下さる方がいらっしゃいましたら、どうぞよろしくお願い致します。(^^)

補足日時:2009/07/10 11:52
    • good
    • 0
この回答へのお礼

ありがとうございました(^^)
また何かありましたら、教えて下さいね。

お礼日時:2009/07/10 16:19

・継承について


⇒例えば下記のようなデータベース接続用クラスを作ったとして、
<?php

class Database{

$db = null;

public function __construct(){
$this->db = sqlite_open('hoge');
}

//与えられた配列を展開して$tableにInsertするメソッド
public function insert($table, $array){
//省略
}

}


?>
これで、
<?php

$db = new Database();

$db->insert('TableName', $_POST);

?>
とすれば、「TableName」テーブルにPOST値の配列をインサートすることが出来ます。
さらにコレを継承して、常に特定のテーブルだけに接続するクラスを作成。
<?php

class TableName extends Database{

public function insert($array){
return parent::insert('TableName', $array);
}

}

?>

このようにすれば、
<?php

$db = new TableName();

$db->insert($_POST);

?>
これだけで済みます。
また、これだと、「Hoge」というテーブルに接続するときも、同等の継承クラスを書かなくてはならず、
面倒なので、この考え方をベースに、
<?php

class CommonDb extends Database{

protected $tablename = '';

public function insert($array){
return parent::insert($this->tablename, $array);
}

}

?>
というものを作ってやって、コレに対して継承し
<?php

class TableName extends CommonDb{
protected $tablename = 'TableName';
}

class Hoge extends CommonDb{
protected $tablename = 'Hoge';
}

?>
とすれば、簡単にデータベースの特定のテーブルにアクセスするクラスが出来ます。
update処理や、select処理をする場合にも「Database」クラスに追記してやって
「CommonDb」クラスにもinsert文で作成したように記述していってやれば
その最後に来ている「TableName」/「Hoge」クラスにも実働が与えられます。
さらにHogeクラスにだけ、特殊なメソッドを与えたければHogeに記述してやれば
Hogeだけで動作できるメソッドが出来、また、そのメソッドを全てに適用したければ
またCommonDbやDatabaseに含ませてやれば全てに適用できます。

イメージ沸きますでしょうか。

※これだとクラスをnewするたびに別々のリソース($db = sqlite_open()したときの$db変数が別々に。)が
発生してしまうので、別途Singletonパターンなんかも使用する必要があります・・・
    • good
    • 0
この回答へのお礼

hogehoge78さん、またしてもありがとうございます^^

現在の私には、ちょっと難しかったのですが、なんとなく言わんとすることは分かる気がします。
あともう少ししたら、アドバイス頂いた内容をしっかり理解できるようになると思うので、そのときにもう一度じっくり読ませて頂きますね^^

今回もありがとうございました。
とても助かります。(^^)!

お礼日時:2009/07/12 21:00

>「継承」を使うことで得られる具体的なメリットについて、気になっていたりします。


>どなたか、この点についてクローズアップして下さる方がいらっしゃいましたら、どうぞよろしくお願い致します。(^^)
他人が作ったクラスの詳しい仕様がわからなくても比較的簡単に初期値の変更をしたり機能追加したりできる。
    • good
    • 0
この回答へのお礼

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

>他人が作ったクラスの詳しい仕様がわからなくても比較的簡単に

そんなもんなんですね。
この点も想像していたものと違っており、メリットとして充分考えられる要素だなと感じました。

お礼日時:2009/07/10 18:56

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!