※ ChatGPTを利用し、要約された質問です(原文:クラスにおける、メンバー変数の「$」の有無について)
クラスにおける、メンバー変数の「$」の有無について
このQ&Aのポイント
クラスについて学習中です。テキストに載っていた、以下のサンプルスクリプトについて質問があります。
疑問1:nameと$nameは別物なのか?考察1:おそらく別物だろう。
疑問2:別物であるなら「name」とは何なのか?考察2:おそらく、「決まり」なのだろう!?
クラスにおける、メンバー変数の「$」の有無について
クラスについて学習中です。
テキストに載っていた、以下のサンプルスクリプトについて質問があります。
(他言語の方々へ。PHPは特に指定しなかった場合、アクセス制限はpublicです)
<?php
class Book {
var $name="";
function Book($name)
{
$this->name=$name; //6行目【注1】
}
function display()
{
if ($this->n=="phpの本") { //10行目
$file="php.txt";
echo join(file($file));
} else {
echo "本がありません";
}
}
}
$obj=new Book("本の名前");
//display()というメソッドを呼ぶ
$obj->display();
//nameというメンバー変数を読み込む
echo $obj->name;
?>
今回の疑問・質問のスタートは6行目【注1】の箇所でした。
『疑問1』
nameと$nameは別物なんだろうか?(「=」で結べば中身が同じになるのは当然ですが、それ以前の概念?の話です)
『考察(予想)1』
おそらく別物だろう。もし同一なら6行目の式が意味を成さない(不要)だろうから。
『疑問2』
別物であるなら「name」とは何なのだろう?「メンバー変数」というものであることは知ったが、(関数や定数ではなく)変数の一種なのに、なぜ「$」が無いのだろう?
『考察(予想)2』
クラスやオブジェクトの記述で、「$this->」や「$obj->」などの後に続く場合は$を書かずに「メンバー変数」とすることが決まっている!?もしここに「$」を付けてしまうと、それは「$name」となってしまい、考察1と矛盾することになるから、おそらく、「決まり」なのだろう!?
『疑問3』
「$name」については3行目においてメンバー変数であることを宣言しているのに対し、「name」について宣言しないのはなぜだろう。
『考察(予想)3』
試しにnameについても「var name;」と書いてみたらエラーになった。やはり最初に宣言するときは「$」が必要なようだ。そうすると・・「$name」と書くはめになり、考察1と矛盾してしまう。
よし。試しに($nameではない)「name」の箇所を「nnnn」としてみよう。
(6行目、10行目、下から2・3行目の4箇所)
こう変更してみても同様に動いたことで、「name」と「$name」は綴りを同じにしてるだけの別物だろうなのだろうと理解したつもりになりました。
そして、事前に「nnnn」を(var $nnnn;と)メンバー変数宣言することが可能であることも、もしくは「var $name;」を省略しても同様に動くことを確認しました。
ところが同時に新たな疑問が湧きました。
『疑問4』
「nnnn」を事前に宣言するときは「var $nnnn;」と、「$」を付けないとエラーになる。・・・え?とすると、元の「name」と「$name」の場合のスクリプト3行目の「var $name;」というのは、「name」について宣言してるのか、それとも「$name」について宣言してるのかどっちなのだろう?・・・同じこと?ってことは『考察1』の「別物である」は誤りなの?でもnameを「nnnn」と変えても同じように動くんだよね?・・・何がなんだかわからなくなってきた。
という状態なのです。
どなたか、このモヤモヤっとした疑問を消してください。
お願いします。
お礼
とても丁寧な回答、ありがとうございました。 おかげさまでしっかりと理解できました。 「謎は全て解けた!」という気分で、感無量です。 「直前に『$』が付いているかどうか」が問題では無かったのですね。 もし、私の誤りを指摘するだけなら、 >「$this->name」で「1つ」です。「->」でぶった切ってはいけません。 >で、当然ながら「$this->name」と「$name」は別物です。 これだけでも回答にはなっているところを、その後も私の愚かな考察(予想)に対して ☆と★、Booknameとargを用いたりとわかりやすくご説明下さったおかげで、対応部分を把握でき、質問部分について100%の理解に到ることが出来ました。 本当にありがとうございました!