PHPについて質問です。

ユーザー定義関数とクラスの違いが今ひとつわかりません。
特にクラスににできてユーザー定義関数にできないこと、
どういう時にクラスを使うべきかということをを素人にもわかりやすく教えてください。

回答の条件
  • 1人2回まで
  • 13歳以上
  • 登録:2010/08/04 22:01:51
  • 終了:2010/08/06 17:33:21

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/08/05 01:37:10

ポイント42pt

>データの保持

コードを書いたほうがいいのか迷いましたがキッチリ説明しようとすると、いろいろ長くなりますので、今回は大まかに書いてみます(それでも長いです。笑)

値の引渡しが不要な処理の場合もありますが、ここでは値を渡す必要がある場合を想定して話を進めます

 

【1】関数への値渡し

$変数x = 関数(引数);

呼び出す度に引数を渡す必要があります

引数を与えずとも、パブリックな変数を関数内から参照する事は可能なのですが、関数の独立性や判読性が悪くなるのであまり使いません

(関数を複数人で共有したり配布したり、システムを移植したりメンテナンスしたりする時に「引数はxxにしてね」だけのほうが楽なのです)

 

【2】クラスへの値渡し

$変数y = new クラス;

$変数y->クラス変数 = 値;

値はいつの状態でも与えることが可能であり、次に変更するまで保持され続けます

 

【3】クラスの利点

複雑なシステムになってくると同名の関数が存在してしまったりする心配がありますが、クラスは下記のように使いますので同名でも心配がなく、これまた使いまわしが楽になります

$変数y = new クラスy;

$変数y->関数a;

$変数z = new クラスz;

$変数z->関数a;

 

同名の関数を使えるという点を利用してクラスでは次のような使い方も出来ます。例えばMySQL接続用のクラスを作ったとします

$変数y = new MySQL用クラス;

$変数y->関数y;

同名で同様の機能を持ったPostgreSQL接続用クラスを作ったとします

$変数y = new PostgreSQL用クラス;

$変数y->関数y;

置き換えはnewの部分だけで済み、他の部分は改造が不要なので使いまわしや移植、システム変更が楽になります

 

【4】関数とクラスの使い分け例

複数のスクリプトで使いまわすならばクラスが便利です。そのスクリプト内だけで使うならば関数が便利です

使いまわしでも、あまりに単純な処理をいちいちクラスにすると使うときが逆に面倒なので少し長くなるものをクラスとします

そのスクリプト内だけの場合でも状態を保持したほうが便利な場合はクラスにします

id:taroemon

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

ずいぶんすっきりとわかりました。

2010/08/06 17:33:00

その他の回答(1件)

id:tasklight No.1

tasklight回答回数323ベストアンサー獲得回数402010/08/04 22:16:24

ポイント28pt

クラスと関数の違いは、データの持ち方という観点から眺めてみると明らかです。


関数は与えられた入力(引数)に対して、処理結果を戻り値として出力するだけのしくみです。つまり、データはただ関数を「通過」していくだけで、その中に留まることはありません。

しかし、クラス/オブジェクトは自分自身の中にデータを格納することができます。処理前、あるいは、処理後のデータを保持しておき、必要に応じて利用することができます。

つまり、クラス/オブジェクトと関数、そして、変数とを比較してみると、下表のようになります。

データを保持 データを処理
変数 ×
関数 ×
クラス/オブジェクト

【参考書籍】

独習PHP 第2版

独習PHP 第2版

  • 作者: 山田 祥寛
  • 出版社/メーカー: 翔泳社
  • メディア: 大型本


クラスを使うべき時というのは、“データありき”で動くシステム(オブジェクト指向型システム)を作る時です。

方程式やグラフで解けるような問題は、ユーザー定義関数を使えば十分です。

id:taroemon

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

私にはデータの保持というのがもう少しわかりませんでした。

具体的な例を示していただけるとさらに参考になります。

2010/08/04 22:41:32
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492010/08/05 01:37:10ここでベストアンサー

ポイント42pt

>データの保持

コードを書いたほうがいいのか迷いましたがキッチリ説明しようとすると、いろいろ長くなりますので、今回は大まかに書いてみます(それでも長いです。笑)

値の引渡しが不要な処理の場合もありますが、ここでは値を渡す必要がある場合を想定して話を進めます

 

【1】関数への値渡し

$変数x = 関数(引数);

呼び出す度に引数を渡す必要があります

引数を与えずとも、パブリックな変数を関数内から参照する事は可能なのですが、関数の独立性や判読性が悪くなるのであまり使いません

(関数を複数人で共有したり配布したり、システムを移植したりメンテナンスしたりする時に「引数はxxにしてね」だけのほうが楽なのです)

 

【2】クラスへの値渡し

$変数y = new クラス;

$変数y->クラス変数 = 値;

値はいつの状態でも与えることが可能であり、次に変更するまで保持され続けます

 

【3】クラスの利点

複雑なシステムになってくると同名の関数が存在してしまったりする心配がありますが、クラスは下記のように使いますので同名でも心配がなく、これまた使いまわしが楽になります

$変数y = new クラスy;

$変数y->関数a;

$変数z = new クラスz;

$変数z->関数a;

 

同名の関数を使えるという点を利用してクラスでは次のような使い方も出来ます。例えばMySQL接続用のクラスを作ったとします

$変数y = new MySQL用クラス;

$変数y->関数y;

同名で同様の機能を持ったPostgreSQL接続用クラスを作ったとします

$変数y = new PostgreSQL用クラス;

$変数y->関数y;

置き換えはnewの部分だけで済み、他の部分は改造が不要なので使いまわしや移植、システム変更が楽になります

 

【4】関数とクラスの使い分け例

複数のスクリプトで使いまわすならばクラスが便利です。そのスクリプト内だけで使うならば関数が便利です

使いまわしでも、あまりに単純な処理をいちいちクラスにすると使うときが逆に面倒なので少し長くなるものをクラスとします

そのスクリプト内だけの場合でも状態を保持したほうが便利な場合はクラスにします

id:taroemon

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

ずいぶんすっきりとわかりました。

2010/08/06 17:33:00

コメントはまだありません

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

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

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

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