phpとjavascriptを使っているのですが、関数とクラスの違いがいまいちわかりません。
クラスは設計図のようですが関数も何度も使う物なので同じように感じてしまいます。
初心者にもわかるように教えていただければ幸いです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答5件
0
関数は状態を持ちません。状態とは関数を呼び出す前と関数を呼び出した後の、何かしらの値の事です。関数の中でグローバル変数を変更すれば、それは状態が変わったと言えるかもしれませんが、その関数にとって値が更新出来る物が1つに定まってしまいますよね。
そこで以下を見て下さい。
php
1<?php 2 3class Counter 4{ 5 protected $n; 6 7 public function __construct(int $n) 8 { 9 $this->n = $n; 10 } 11 12 public function result() 13 { 14 return $this->n; 15 } 16 17 public function add() 18 { 19 $this->n++; 20 } 21}
これは add と result というメソッドを持ったカウンタクラスで、初期値を与えられる様になっています。ですので以下の様に 3 からスタートするカウンタ c1 と 5 からスタートするカウンタ c2 をそれぞれ異なる値を保持したまま作る事が出来ます。
php
1$c1 = new Counter(3); 2$c2 = new Counter(5); 3 4$c1->add(); $c1->add(); $c1->add(); 5echo $c1->result(); # 6 が出る 6 7echo "\n"; 8 9$c2->add(); $c2->add(); $c2->add(); 10echo $c2->result(); # 8 が出る
投稿2018/01/30 09:34
総合スコア5030
0
クラスは「構成要素 または 役割」、関数は「機能」と思うといいかもしれません。
例えば「ボールペン」というクラスがあったとします。
ボールペンの構成要素を大きく分けると、
「インクの色・ボディの色・インクの量」などの「データ」と
「ペンの後ろをノックするとペン先が出る」などの「機能」になります。
プログラムではこの「データ」を「プロパティ(変数)」として定義し、
「機能」を「関数(メソッド)」として定義します。
このクラスを使えば「赤色のインクが出るボールペン」「ボディが白いボールペン」など、「基本的には同じだけど、一部が違うもの」を簡単に表現ことが出来ます。これが「設計図」とも言われる所以です。
もう1つ例として、「ボールペンを管理するクラス」を考えます。
このクラスは「インクの無くなったボールペンを破棄する」「補充用ボールペンを購入する」などの機能(関数)を持っています。
一見するとクラスではなく関数だけあればいいようにも見えます。事実、PHPやJavascriptではクラスでなくても動作します。
ですが他の言語だと「全てのスクリプトは何らかのクラスでなければならない」という仕様になっているものがあります。
この場合、「ボールペンを管理するクラス」は「構成要素」と言うよりは「役割」と言った方が分かりやすいと思います。
なお、「役割」の場合でも「データ(プロパティ/変数)と機能(関数/メソッド)を持つ」という原則は変わりません。
「ボールペンを管理するクラス」のデータの例で言えば「補充する時は何本ずつ購入するか」などが考えられます。
投稿2018/01/30 11:03
総合スコア11427
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2018/01/31 04:13
退会済みユーザー
2018/01/31 04:39
2018/01/31 06:21 編集
退会済みユーザー
2018/01/31 06:52
0
ベストアンサー
関数はデータ(引数)を入力したらなにかしら結果を返す一連の処理をまとめたヤツです。
基本的に同じデータを入れたら同じ結果を返す処理が好ましいです。基本的にです。
(乱数を返すとか時間を返すとかクロージャ使うとか意地悪は今回ナシで)
クラスはデータ(メンバ変数)の保持と、そのデータに対して作用するメソッド(メンバ関数)を一塊としてまとめたヤツです。
いろんな機能を詰め込めますが、使う時に実体化(new)させたりちょっと手間がかかります。
同じデータを入れても、メソッドを呼び出す順序や回数で結果が変わってくるような処理が大得意です。
データ(状態)をカプセル化し、他のプログラムからデータが変更されるのを防ぐといった使い方も得意です。(設計しだいですが^^)
ただ複雑に多機能化しすぎるとテスト・デバッグが難しい厄介なクラスが出来上がったりします。
なんでも詰め込めまずに、役割分担の設計バランスが重要になってきます。
投稿2018/01/30 11:01
編集2018/01/30 11:40総合スコア764
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/31 02:27
2018/01/31 05:04 編集
退会済みユーザー
2018/01/31 07:04
2018/01/31 09:42 編集
退会済みユーザー
2018/01/31 13:25
2018/02/01 05:11 編集
退会済みユーザー
2018/02/02 06:40
2018/02/02 09:49 編集
退会済みユーザー
2018/02/04 04:05
2018/02/05 07:52 編集
0
関数はいわゆるサブルーチンです。大雑把に言えば下請け処理です。
クラスは複数の関数と変数を包括して定義できる概念です。一方、この概念を実体化したのものはオブジェクト(インスタンス)といいます。
投稿2018/01/30 11:56
総合スコア4830
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/31 03:33
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
退会済みユーザー
2018/01/30 10:13
2018/01/30 10:17
2018/01/30 10:19
退会済みユーザー
2018/01/30 11:06
2018/01/30 11:12
退会済みユーザー
2018/01/30 11:38
2018/01/30 14:27
退会済みユーザー
2018/01/31 02:10