プログラミング言語としては、PHPだけ、ある程度分かります。
職業プログラマではありません。
回答は、PHP4、5、どちらで回答して下さっても結構です。
両方について比較しながら回答して下さると、さらに嬉しいです。
(ver.4→ver.5で、オブジェクト指向がかなり強化されているようですね。)
私が使用しているPHPのバージョンは4.4.8です。
連携データベースはSQLite2.8です。
(MySQLの知識はありませんが、今後、勉強していく予定です。)
さて、本題に入りますが、
PHPにおいて、
クラスの書き方の作法については大体分かりました。
オブジェクト指向の考え方もある程度は頭に入っています。
ただ、このクラスというものが具体的にどういう時に役立つのか、今一つピント来ないので、
どなたか、その辺りを実際的かつ豪快に教えて下さい。
C言語やJAVAの参考書には、クラスの意義などがしっかり書かれているのかもしれませんが、
PHPの参考書には、なかなかそういった本が無さそうなので、このような質問をさせて頂きました。
(PHPの本は、10冊以上は読んでいると思います。)
回答の指針を以下に挙げておきますので、よろしければ参考にして下さい。
・クラスじゃないと表現できないスクリプト例。(内容を言葉で、または、コードで。)
・クラスを利用して便利だなぁと感じた瞬間。(同上)
・クラスを使わなかった場合に感じる不便さ、の例。(同上)
・クラスを使わず、ユーザ定義関数だけで対処することとの違い。(同上)
・逆に、クラスを使うことのデメリット。
-------------------
回答を頂きましたら、適宜、補足なりお返事をさせて頂きます。
以上、よろしくお願い致します。
No.1ベストアンサー
- 回答日時:
とても単純なことだが、たとえばある程度の規模の開発をするとして、汎用的な機能を関数としてまとめると思う。
そのとき、ライブラリの中に300個の関数がずらっと並んでいる状態を想像してみてほしい。それと、10個ほどのメソッドを持ったクラスが30個ある状態を比べて、どっちがメンテナンスしやすいか想像してみてほしい。関数というのは、あくまで「処理」をまとめたものだ。クラスは、処理と値をひとまとめにできる。つまり、クラスでは、ある機能について、それに必要な処理と、必要な値をすべて自身の中に保持し管理できる。重要なのは、その値と同じ名前の変数などがクラス外にあっても、まったく影響を与えないという点だ。
いくつもの機能があって、それぞれで数百の値を保持しながら動くようなプログラムを考えてみよう。それだけの変数を管理するのは、大変だろう。クラスならば、そのクラスに必要な値はすべてクラス内にパッケージングできる。「ええと、これの値はどこだ?」となれば、そのインスタンスからメンバ変数を取り出せばいい。
まぁ、たとえば、ハードディスクで「フォルダが作れないファイルシステム」を想像してみると、フォルダの重要性がわかると思う。このフォルダ=クラスとイメージしたらどうだろう?
クラスの利点は他にもいろいろあると思うが、まぁ一番直感的にわかりやすいという点ということで。
この回答への補足
回答ありがとうございます。
>300個の関数がずらっと並んでいる状態
>10個ほどのメソッドを持ったクラスが30個ある状態
もちろん、1つの例として、読ませて頂きましたが、
300個のバラバラなユーザ定義関数を、10個ほどのメソッドを持ったクラス30個に統合できるような、
そんな使い方ができるのであれば、クラスの利用価値はあると私にも感じられます。
クラスを使用したことのない私には、300個のバラバラなユーザ定義関数を、30個のクラスにまとめるようなことが、
実際的に出来るのかどうか分からなかったので、今回このような意見を頂き、大変参考になりました。
>重要なのは、その値と同じ名前の変数などがクラス外にあっても、まったく影響を与えないという点
スコープ(グローバル、ローカル)のお話ですね。
メンバ変数、メソッド、それぞれの中身が意図しない所で変えられてしまうのをある程度防ぐ効果がありますよね。
また、スクリプトファイル内において、スコープのことさえしっかり意識できていれば、同一名の変数を重複して使うことができるので、
変数名を考える際の手間を低減することにもつながりますよね。
この点に関するメリットは私にも何となく分かります。
>ハードディスクで「フォルダが作れないファイルシステム」を想像してみる
それは不便ですね。
これと同じような不便があるのだとしたら、クラスを使わない手はないですね。
>クラスの利点は他にもいろいろあると思うが、まぁ一番直感的にわかりやすいという点ということで。
はい、回答頂いた点に関して、その点における利便性についてはよく分かりました。大変参考になりました。
ありがとうございます。
--------------
(補足)
「継承」を使うことで得られる具体的なメリットについて、気になっていたりします。
どなたか、この点についてクローズアップして下さる方がいらっしゃいましたら、どうぞよろしくお願い致します。(^^)
No.3
- 回答日時:
・継承について
⇒例えば下記のようなデータベース接続用クラスを作ったとして、
<?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パターンなんかも使用する必要があります・・・
hogehoge78さん、またしてもありがとうございます^^
現在の私には、ちょっと難しかったのですが、なんとなく言わんとすることは分かる気がします。
あともう少ししたら、アドバイス頂いた内容をしっかり理解できるようになると思うので、そのときにもう一度じっくり読ませて頂きますね^^
今回もありがとうございました。
とても助かります。(^^)!
No.2
- 回答日時:
>「継承」を使うことで得られる具体的なメリットについて、気になっていたりします。
>どなたか、この点についてクローズアップして下さる方がいらっしゃいましたら、どうぞよろしくお願い致します。(^^)
他人が作ったクラスの詳しい仕様がわからなくても比較的簡単に初期値の変更をしたり機能追加したりできる。
回答ありがとうございます。
>他人が作ったクラスの詳しい仕様がわからなくても比較的簡単に
そんなもんなんですね。
この点も想像していたものと違っており、メリットとして充分考えられる要素だなと感じました。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- PHP アップロード画像数でCSSを分けることに成功したのですが、画像の横に文字を並べることが出来ません。 3 2023/07/28 17:16
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- 高校 テスト勉強について 中間テストの結果がかえってきたのですがあまりよくありませんでした。 現代の国語と 2 2023/06/05 00:46
- その他(教育・科学・学問) 大学期末試験における不合格処理はなるべく避けた方がいいですか。 3 2022/08/20 15:42
- 学校 中2女子不登校です。中2の5月辺りからクラス替えの変化で1年の頃からのストレスによる頭痛が悪化し、体 2 2022/03/23 17:16
- PHP アップロードファイルの数に応じてCSSを動的に変更したいのですが、方法がわかりません 3 2023/07/23 21:59
- TOEFL・TOEIC・英語検定 2014年に購入した英文法書でTOIEC対策をしてもよいか? 1 2023/01/08 11:41
- 日本語 「災害級の暑さ」と言う言い方について 12 2023/08/02 20:36
- その他(プログラミング・Web制作) Pythonで複数のメソッドをまとめて管理する方法について 1 2023/03/30 00:01
- C言語・C++・C# C言語初心者 構造体 課題について 2 2023/03/10 19:48
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
配列とオブジェクトの違い
-
ラッパークラスって何ですか?
-
phpのクラスメソッドの定義が長...
-
php インスタンスとオブジェク...
-
onedrive にexcelファイルをア...
-
フォントの色を変えるには?
-
バッチを用いたフォルダの自動移動
-
phpとaspの違いについて
-
form actionで二つ送信先を指定...
-
phpで画像がどうしても文字化け...
-
透過PNGが透過されない!!
-
PHP8を使うと、大量のWarningが...
-
index.phpって何ですか? 具体...
-
PHPで、エラーがない場合のみ画...
-
これの対応OSを教えて下さい。p...
-
ワードプレスサイト PHP8.0.25...
-
PHPからロリポップ!のメールサ...
-
PHPで複数ファイルのダウン...
-
PHPをhtmlに読み込んだファイル...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
ラッパークラスって何ですか?
-
phpのクラスメソッドの定義が長...
-
class定義のphpをファイル分割...
-
PHP4、PHP5 1ファイル複数クラ...
-
phpのクラスにて別ファイルの変...
-
'_'(アンダースコア)の使い方...
-
コンストラクタで参照渡しをす...
-
データベースで値をインクリメ...
-
クラス
-
【PHP】クラス と 関数 の違い
-
ユーザ定義関数にデフォルト引...
-
PHPのフレームワークの中でSmar...
-
phpのオブジェクトの使用方法に...
-
phpでクライアントのブラウザの...
-
配列とオブジェクトの違い
-
POSTとGET
-
Codeigniter コアクラスの継承
-
外部ファイルのクラスのインス...
-
class.upload.phpの戻り値(返...
おすすめ情報