• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:クラスにおける、メンバー変数の「$」の有無について)

クラスにおける、メンバー変数の「$」の有無について

このQ&Aのポイント
  • クラスについて学習中です。テキストに載っていた、以下のサンプルスクリプトについて質問があります。
  • 疑問1:nameと$nameは別物なのか?考察1:おそらく別物だろう。
  • 疑問2:別物であるなら「name」とは何なのか?考察2:おそらく、「決まり」なのだろう!?

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>『疑問1』 >nameと$nameは別物なんだろうか? 「$this->name」で「1つ」です。「->」でぶった切ってはいけません。 で、当然ながら「$this->name」と「$name」は別物です。 「$this->name」は、3行目で宣言された「var $name="";」の事です。 「function Book($name)」の「$name」は、これとは別の「引数」です。 なので $this->name=$name; //6行目【注1】 は「Book関数に渡された引数の中身を、3行目で宣言されたvar $nameに代入する」と言う意味になります。 >『疑問2』 >別物であるなら「name」とは何なのだろう? 「$this->nameで1つ」と考えて下さい。前述の通り、3行目で宣言された「var $name="";」の事です。 >『疑問3』 >「$name」については3行目においてメンバー変数であることを宣言しているのに対し、「name」について宣言しないのはなぜだろう。 引数は、関数Bookの宣言と同時に宣言されるので、宣言の必要がありません。 <?php class Book { var $name=""; ←これは「Bookクラスにnameという変数を作り、空文字で初期化する」との宣言 function Book($name) ←これは「関数Bookがあり、引数はnameだ」との宣言。関数と引数を同時に宣言している { $this->name=$name; ←これは「引数nameの値をメンバ変数nameに代入」と言う意味 } >『疑問4』 >「nnnn」を事前に宣言するときは「var $nnnn;」と、「$」を付けないとエラーになる。 そうです。変数を宣言する時は、すべて$が要ります。 このサンプルは「たとえ同じ名前であっても、引数とメンバ変数は違うモノだよ」と言うのを教える為の物です。 サンプルが <?php class Book { var $bookname=""; //★ function Book($arg) //☆ { $this->bookname=$arg; //3行目で宣言したbooknameに引数argの値を代入する } (以下略) だったら、多分、何も悩まなかった筈です。 ★で宣言された「自分自身のクラス内のbookname変数」にアクセスするには「$this->bookname」と書きます。 「this->」が「自分自身のクラス内の」を意味し、「bookname」が「どのメンバ変数か」を意味します。 それが2つ繋がって「this->bookname」になって「自分自身のクラス内のbookname」になります。 そして、それに「$」が付いて「$this->bookname」になった瞬間、始めて「自分自身のクラス内のbookname変数の中身」になり、それにアクセス出来ます(代入したり、内容を取り出したり出来る) ☆で宣言された「$arg」は、この関数の引数です。 引数は関数の宣言と同時に宣言されるので、すぐに使えます。 $obj=new Book("本の名前"); と実行すると、Bookクラスのobj変数が作られ、同時に関数Bookが呼ばれ、引数に「"本の名前"」が渡されます。 関数Bookが function Book($arg) //☆ と宣言されているなら「Book関数の中に来た瞬間、$argには"本の名前"が入っている」ことになります。 >でもnameを「nnnn」と変えても同じように動くんだよね? 変え方を間違うと動きません。 <?php class Book { var $nnnn=""; function Book($name) { $this->name=$nnnn; //6行目【注1】 } こう変えたら動きません。 Bookクラスにはnameと言うメンバ変数はありませんから、エラーになります。 また、6行目の$nnnnは、未定義の変数ですから、これもエラーになります。 変えるなら <?php class Book { var $nnnn=""; function Book($name) { $this->nnnn=$name; //6行目【注1】 } こうです。 変数の宣言、代入、参照の関係を判りやすく書くと <?php class Book { var $★★★=""; //宣言 function Book($☆☆☆) //宣言 { $this->★★★=$☆☆☆; //代入と参照 } って事になります。 3行目の★★★と6行目の★★★、4行目の☆☆☆と6行目の☆☆☆が、それぞれ対応します。 それぞれの変数は「異なる空間に別々に存在する」ので「★★★の名前をnameに、☆☆☆の名前もnameにすることが可能」です。 で、「★★★の名前をnameに、☆☆☆の名前もnameにした結果」が、質問文の <?php class Book { var $name=""; function Book($name) { $this->name=$name; //6行目【注1】 } という「紛らわしくて訳の判らないプログラム」なのです。

take-0314
質問者

お礼

とても丁寧な回答、ありがとうございました。 おかげさまでしっかりと理解できました。 「謎は全て解けた!」という気分で、感無量です。 「直前に『$』が付いているかどうか」が問題では無かったのですね。 もし、私の誤りを指摘するだけなら、 >「$this->name」で「1つ」です。「->」でぶった切ってはいけません。 >で、当然ながら「$this->name」と「$name」は別物です。 これだけでも回答にはなっているところを、その後も私の愚かな考察(予想)に対して ☆と★、Booknameとargを用いたりとわかりやすくご説明下さったおかげで、対応部分を把握でき、質問部分について100%の理解に到ることが出来ました。 本当にありがとうございました!

その他の回答 (1)

  • singlecat
  • ベストアンサー率33% (139/418)
回答No.1

質問の中身と違う答えになりますが、ちょっと整理しましょう。 一番最初に $obj=new Book("本の名前"); が実行されます。 この時$objが、Bookのクラスとして生成されますね。 その時に、同時に"本の名前"を引数で渡すことで、 var $name=""; <<<このメンバーに初期値を与えているんですね。 引数で渡さないなら、newの後で、 $obj->name="本の名前"; とする事もできます。 こんな風に少しずつ整理してみませんか?

take-0314
質問者

お礼

ご回答、ありがとうございます。 僕はクラスの定義部分?で疑問が湧き、考えたり試したりしているうちにつまづいてしまいましたが、 なるほど、オブジェクト部分?でも、そのように書き換えることも出来るのですね。 質問の中身とは違いましたが、確実に理解が一つ深まりました。 ありがとうございました。

関連するQ&A