プログラミング初心者です。本を参考にしてPHPを勉強しています。
クラスの章でコンストラクタについて以下のように書かれていました。
コンストラクタはインスタンス化のタイミングで実行されるという性質上、
プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化
といった処理を記述するのが一般的です。
初期化処理が不要な場合、コンストラクタは省略可能。
ここで質問です。
インスタンス化を行うのは初期化するためということでしょうか?
「~といった処理を記述するのが一般的」ということは、初期化が
本来の目的ではないという意味にもとれますがどうなんでしょうか。
また静的メソッドについては、
「インスタンス化を行わなくても利用できるメソッド」
と書かれていましたが、何がどう違うのか分かりません。
初期化とは何でしょうか?またなぜ初期化を行うのでしょうか?
静的メソッドと何が違うのでしょうか?
No.4ベストアンサー
- 回答日時:
あ、あと初期化ってのは下の例でいうと
哺乳類の設計図
プロパティ
名前
性別
年齢
生死状態
メソッド
歩く
走る
たとえば哺乳類のインスタンスを作る時はデフォルトで生きてて欲しいって思うわけです。そういう場合に
コンストラクタで生死状態を「生」で初期化します。
コンストラクタ(){
生死状態="生"
}
これで $honyuurui_No1 = new honyurui();を実行した時に生死状態を指定しなくても勝手に「生」の状態でインスタンスが作成されます。
ご回答ありがとうございます。
> たとえば哺乳類のインスタンスを作る時はデフォルトで生きてて欲しいって思うわけです。
初期化とはデフォルト値を設定するということですか?
だとしたら、なんとなく分かったような気がします。
あ、でも静的(あるいは動的)の違いが分かりません。
(回答番号No.1の補足欄に追記しました)
No.6
- 回答日時:
コンピュータにおける静的動的の意味を説明をします
静的とは
値が決まっていて変わらない事
動的とは
値が後から決まる事
です。
例えばインスタンスを作る時間はその時間にならないと分からないので動的な値になります。#1さんの例ではtime()関数を実行したタイミングで時間を取得して初期化するという例です。
たとえばインスタンスを生成した時間を初期値として持たせたい場合は、インスタンスを生成するまでは、決定できませんので予めソースコードに埋め込んで指定する事はできません。変わりに時間を取得する命令を初期値として書いておくわけです。つまり動的な指定という事です。
初期化に関してはデフォルト値を持たせたいという意味で理解していただいても問題ありません。
No.3
- 回答日時:
インスタンスの意味が分かっていないようですね。
私もそれほど詳しいわけではないのですが、インスタンスはクラス(設計図)から製品(テレビ)を作る作業に似ています。インスタンス化をする事によりオブジェクトが作成できオブジェクトの機能を利用できます。オブジェクトはそれぞれ独自の変数を持つ事ができます。インスタンス化させる事により、自身の情報は自身で持ってね。って事ができます。インスタンス化をしなければクラスの意味はほぼありません。クラスはインスタンス化して利用するものです。
静的メソッド、静的変数についてはインスタンス化を行わなくても利用できますがインスタンス化を行わないためにインスタンス自身の持つ変数にアクセスできません。また静的変数メソッドはクラスに一つだけもつことができて共有されるはずです。(たしか)なので管理したいそれぞれの情報を持たせることはできません。
javaの例になってしまい申し訳ないですが
//static void mainはエントリポイントです。ここから始まります。
public class test {
public static void main(String[] args) {
//クラスheをccとしてインスタンス化
He cc = new He();
//ccのaaメソッドを実行
cc.aa(); //axcが表示されます。
//ccのbbメソッドを実行
cc.bb();
}
}
class He{
public String va;
public void aa() {
//これはインスタンスの持つ変数vaにaxcを代入
this.va="axc";
//インスタンスの持つ変数の状態を表示
System.out.println(this.va);
}
public static void bb() {
//これはstaticなのにインスタンスが必要なthis.vaに
//アクセスしてるので間違い(コンパイルエラー)
this.va="ppp";
System.out.println(this.va);
}
}
哺乳類の設計図
プロパティ
名前
性別
年齢
生死状態
メソッド
歩く
走る
こういう設計図を元に哺乳類をインスタンス化すると哺乳類1、哺乳類2にそれぞれ名前や年齢を持たせることができます。
あんまり説明がうまくないかな・・。そんな感じです。
No.2
- 回答日時:
私もPHP勉強中の者なので参考意見として回答させて頂きます。
話半分でイメージだけつかめて頂ければと思います。
#コンストラクタはインスタンス化のタイミングで実行される
$obj = new number(); //←この時点で実行される
例
class number
{
private $num;
public function __construct($num) //newした時にこのメソッドが実行される
{
$this->num = $num;
}
static function sum($x, $y)
{
$result = $x + $y;
return $result;
}
}
上記ではコンストラクタが使われていますが、
$obj->setNumber(5);
等としてインスタンス生成後に設定するのであればコンストラクタは不要になります。
コンストラクタは不要になる物の、インスタンス生成後にメンバー変数に値を割り当てずに他のメソッドを実行されエラーが発生する可能性がある為、そういった意味でも初期化すうのが一般的なのかもしれません。
又静的メソッドですが、これはインスタンス化せずに使えるメソッドです。
$obj = new number;
echo $obj->sum(2,3);
とせずとも直接
echo number::sum(2,3);
として結果が得られます。
説明が下手で伝わりづらいとは思うのですが、私もクラス等使用しはじめた頃はよくわからず、いろいろ作っていくにつれて「あ!こういう時に使える!」と理解してきました。
最初は「こういう事もできるんだなぁ」程度に覚えておけば時が来たときに必然的に使う事になると思います。
ご回答ありがとうございます。
これはどの質問への回答でしょうか?
時間をかけて読み返したのですが分かりませんでした。
せっかくご回答いただいたのに申し訳ありません。
No.1
- 回答日時:
インスタンスとは、クラスオブジェクトのことです。
値の型に、配列型や文字列型、数値型といったものがあるのと同じようにオブジェクトという型が存在すると考えてください。
クラスオブジェクトはメンバ変数(プロパティ)/メンバ関数(メソッド)を持つことが出来るわけですが
メンバ変数は初期値に静的な値しか持つことが出来ず、動的な値を初期値に持つことが出来ません。
なので、メンバ変数に対して動的な値(例えばメンバ変数に現在時刻を「time()」関数で与えたいとか)を
与えるためには、コンストラクタ内に記述するのが一般的です。
>「~といった処理を記述するのが一般的」
これは本来の目的ではないという意味に捉えるのではなくて、コンストラクタ内で、メンバ変数の値の初期化以外の何らかの演算処理を行うなど
特殊な例もあるということを言っているのではないでしょうか。
静的メソッドに関しては、
「インスタンス化を行わなくても利用できるメソッド」
は、
「インスタンス化を行う必要なく利用したいメソッド」
とも読めます。
通常のメンバ関数(メソッド)は一般的にメンバ変数に与えられた値により処理を振り分けたり、メンバ変数に値を代入するなどといったことを行いますが、
完全にメンバ変数を利用する必要なく、ただ引数に与えられた値を処理して返すだけであれば、
インスタンスを作る必要性が無いので静的に呼び出したほうが、インスタンスを生成する分の処理コストが軽減されます。
逆に言えば、静的メソッドは、メンバ変数を参照することが出来ません。
これが違いです。
この回答への補足
ご回答ありがとうございます。
何が分からないのか上手く説明できてなかったようなので補足します。
> メンバ変数は初期値に静的な値しか持つことが出来ず、動的な値を初期値に持つことが出来ません。
プログラミングでいう静的(あるいは動的)とは何なのか、
その言葉の定義(意味)がわからず、上記の質問をしました。
それが分かれば初期化について理解できるかもしれません。
それから「「time()」関数」についてはまだ勉強してないので、
どういう例えなのかイメージできませんでした。
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・【大喜利】【投稿~11/12】 急に朝起こしてきた母親に言われた一言とは?
- ・好きな和訳タイトルを教えてください
- ・うちのカレーにはこれが入ってる!って食材ありますか?
- ・好きな「お肉」は?
- ・あなたは何にトキメキますか?
- ・おすすめのモーニング・朝食メニューを教えて!
- ・「覚え間違い」を教えてください!
- ・とっておきの手土産を教えて
- ・「平成」を感じるもの
- ・秘密基地、どこに作った?
- ・【お題】NEW演歌
- ・カンパ〜イ!←最初の1杯目、なに頼む?
- ・一回も披露したことのない豆知識
- ・これ何て呼びますか
- ・チョコミントアイス
- ・初めて自分の家と他人の家が違う、と意識した時
- ・「これはヤバかったな」という遅刻エピソード
- ・これ何て呼びますか Part2
- ・許せない心理テスト
- ・この人頭いいなと思ったエピソード
- ・牛、豚、鶏、どれか一つ食べられなくなるとしたら?
- ・あなたの習慣について教えてください!!
- ・ハマっている「お菓子」を教えて!
- ・高校三年生の合唱祭で何を歌いましたか?
- ・【大喜利】【投稿~11/1】 存在しそうで存在しないモノマネ芸人の名前を教えてください
- ・好きなおでんの具材ドラフト会議しましょう
- ・餃子を食べるとき、何をつけますか?
- ・あなたの「必」の書き順を教えてください
- ・ギリギリ行けるお一人様のライン
- ・10代と話して驚いたこと
- ・家の中でのこだわりスペースはどこですか?
- ・つい集めてしまうものはなんですか?
- ・自分のセンスや笑いの好みに影響を受けた作品を教えて
- ・【お題】引っかけ問題(締め切り10月27日(日)23時)
- ・大人になっても苦手な食べ物、ありますか?
- ・14歳の自分に衝撃の事実を告げてください
- ・架空の映画のネタバレレビュー
- ・「お昼の放送」の思い出
- ・昨日見た夢を教えて下さい
- ・ちょっと先の未来クイズ第4問
- ・【大喜利】【投稿~10/21(月)】買ったばかりの自転車を分解してひと言
- ・メモのコツを教えてください!
- ・CDの保有枚数を教えてください
- ・ホテルを選ぶとき、これだけは譲れない条件TOP3は?
- ・家・車以外で、人生で一番奮発した買い物
- ・人生最悪の忘れ物
- ・【コナン30周年】嘘でしょ!?と思った○○周年を教えて【ハルヒ20周年】
- ・あなたの習慣について教えてください!!
- ・都道府県穴埋めゲーム
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
phpのクラスにて別ファイルの変...
-
「クラス関数」「メンバ関数」...
-
PHPのif文でその処理を途中で抜...
-
Subversionのリポジトリの削除
-
PHPにおける時間計算、時間足し...
-
【file_exists】ファイルが存在...
-
onedrive にexcelファイルをア...
-
xamppでGDを使いたい。
-
VBSの「MsgBox」について
-
SSI される .inc ファイル内に ...
-
php.ini を設定を変更すると再...
-
imagecreatetruecolor()関数で...
-
php,mysqlにて画像パス保存/表...
-
ファイルのアップロードで、フ...
-
PythonのTkinter詳しい方へ。画...
-
PHPでネットワークドライブのop...
-
フォントの色を変えるには?
-
CSV出力にHTMLが入ってしまう
-
zip圧縮の種類について
-
PHPでメール送信する際の送信数...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
「クラス関数」「メンバ関数」...
-
phpのクラスにて別ファイルの変...
-
PHP4、PHP5 1ファイル複数クラ...
-
class定義のphpをファイル分割...
-
ラッパークラスって何ですか?
-
乱数のライブラリについて
-
'_'(アンダースコア)の使い方...
-
データベースで値をインクリメ...
-
クラス内でメソッド呼ぶ際、thi...
-
クラスと関数群のうまい使い方
-
Smartyの変数について
-
外部ファイルのクラスのインス...
-
php インスタンスとオブジェク...
-
配列とオブジェクトの違い
-
クラス
-
・オブジェクト指向のメリット...
-
ユーザー定義関数とクラスの違...
-
関数定義の関数名の前にある&(...
-
PHPフレームワーク理解に役立つ...
-
phpで$chars{$num};とした場合...
おすすめ情報