dポイントプレゼントキャンペーン実施中!

プログラミング初心者です。本を参考にしてPHPを勉強しています。
クラスの章でコンストラクタについて以下のように書かれていました。

コンストラクタはインスタンス化のタイミングで実行されるという性質上、
プロパティ(メンバ変数)やクラスで使用する各種リソースの初期化
といった処理を記述するのが一般的です。
初期化処理が不要な場合、コンストラクタは省略可能。

ここで質問です。
インスタンス化を行うのは初期化するためということでしょうか?
「~といった処理を記述するのが一般的」ということは、初期化が
本来の目的ではないという意味にもとれますがどうなんでしょうか。

また静的メソッドについては、
「インスタンス化を行わなくても利用できるメソッド」
と書かれていましたが、何がどう違うのか分かりません。

初期化とは何でしょうか?またなぜ初期化を行うのでしょうか?
静的メソッドと何が違うのでしょうか?

A 回答 (6件)

あ、あと初期化ってのは下の例でいうと



哺乳類の設計図
 プロパティ
  名前
  性別
  年齢
  生死状態
 メソッド
  歩く
  走る

たとえば哺乳類のインスタンスを作る時はデフォルトで生きてて欲しいって思うわけです。そういう場合に

コンストラクタで生死状態を「生」で初期化します。

 コンストラクタ(){
   生死状態="生"
 }

これで $honyuurui_No1 = new honyurui();を実行した時に生死状態を指定しなくても勝手に「生」の状態でインスタンスが作成されます。
    • good
    • 1
この回答へのお礼

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

> たとえば哺乳類のインスタンスを作る時はデフォルトで生きてて欲しいって思うわけです。

初期化とはデフォルト値を設定するということですか?
だとしたら、なんとなく分かったような気がします。

あ、でも静的(あるいは動的)の違いが分かりません。
(回答番号No.1の補足欄に追記しました)

お礼日時:2009/09/07 00:36

コンピュータにおける静的動的の意味を説明をします



静的とは
 値が決まっていて変わらない事
動的とは
 値が後から決まる事

です。

例えばインスタンスを作る時間はその時間にならないと分からないので動的な値になります。#1さんの例ではtime()関数を実行したタイミングで時間を取得して初期化するという例です。

たとえばインスタンスを生成した時間を初期値として持たせたい場合は、インスタンスを生成するまでは、決定できませんので予めソースコードに埋め込んで指定する事はできません。変わりに時間を取得する命令を初期値として書いておくわけです。つまり動的な指定という事です。

初期化に関してはデフォルト値を持たせたいという意味で理解していただいても問題ありません。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
大変参考になりました。

お礼日時:2009/09/08 23:59

あ、コンストラクタはtimeみたいな動的な値じゃないとあんまり意味ないのか。

。静的値でのな初期化なら宣言と一緒に出来ますもんね。。
    • good
    • 0

インスタンスの意味が分かっていないようですね。



私もそれほど詳しいわけではないのですが、インスタンスはクラス(設計図)から製品(テレビ)を作る作業に似ています。インスタンス化をする事によりオブジェクトが作成できオブジェクトの機能を利用できます。オブジェクトはそれぞれ独自の変数を持つ事ができます。インスタンス化させる事により、自身の情報は自身で持ってね。って事ができます。インスタンス化をしなければクラスの意味はほぼありません。クラスはインスタンス化して利用するものです。

静的メソッド、静的変数についてはインスタンス化を行わなくても利用できますがインスタンス化を行わないためにインスタンス自身の持つ変数にアクセスできません。また静的変数メソッドはクラスに一つだけもつことができて共有されるはずです。(たしか)なので管理したいそれぞれの情報を持たせることはできません。

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にそれぞれ名前や年齢を持たせることができます。


あんまり説明がうまくないかな・・。そんな感じです。
    • good
    • 0

私も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);

として結果が得られます。

説明が下手で伝わりづらいとは思うのですが、私もクラス等使用しはじめた頃はよくわからず、いろいろ作っていくにつれて「あ!こういう時に使える!」と理解してきました。
最初は「こういう事もできるんだなぁ」程度に覚えておけば時が来たときに必然的に使う事になると思います。
    • good
    • 0
この回答へのお礼

ご回答ありがとうございます。
これはどの質問への回答でしょうか?
時間をかけて読み返したのですが分かりませんでした。
せっかくご回答いただいたのに申し訳ありません。

お礼日時:2009/09/07 00:35

インスタンスとは、クラスオブジェクトのことです。


値の型に、配列型や文字列型、数値型といったものがあるのと同じようにオブジェクトという型が存在すると考えてください。

クラスオブジェクトはメンバ変数(プロパティ)/メンバ関数(メソッド)を持つことが出来るわけですが
メンバ変数は初期値に静的な値しか持つことが出来ず、動的な値を初期値に持つことが出来ません。
なので、メンバ変数に対して動的な値(例えばメンバ変数に現在時刻を「time()」関数で与えたいとか)を
与えるためには、コンストラクタ内に記述するのが一般的です。
>「~といった処理を記述するのが一般的」
これは本来の目的ではないという意味に捉えるのではなくて、コンストラクタ内で、メンバ変数の値の初期化以外の何らかの演算処理を行うなど
特殊な例もあるということを言っているのではないでしょうか。


静的メソッドに関しては、
「インスタンス化を行わなくても利用できるメソッド」
は、
「インスタンス化を行う必要なく利用したいメソッド」
とも読めます。
通常のメンバ関数(メソッド)は一般的にメンバ変数に与えられた値により処理を振り分けたり、メンバ変数に値を代入するなどといったことを行いますが、
完全にメンバ変数を利用する必要なく、ただ引数に与えられた値を処理して返すだけであれば、
インスタンスを作る必要性が無いので静的に呼び出したほうが、インスタンスを生成する分の処理コストが軽減されます。
逆に言えば、静的メソッドは、メンバ変数を参照することが出来ません。
これが違いです。

この回答への補足

ご回答ありがとうございます。
何が分からないのか上手く説明できてなかったようなので補足します。


> メンバ変数は初期値に静的な値しか持つことが出来ず、動的な値を初期値に持つことが出来ません。

プログラミングでいう静的(あるいは動的)とは何なのか、
その言葉の定義(意味)がわからず、上記の質問をしました。
それが分かれば初期化について理解できるかもしれません。

それから「「time()」関数」についてはまだ勉強してないので、
どういう例えなのかイメージできませんでした。

補足日時:2009/09/07 00:33
    • good
    • 0

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