クラスのメンバが上書きされる

このQ&Aのポイント
  • クラスのメンバーがなぜか上書きされてしまう事態になってしましいます。
  • PHPの環境はPHP 5.0.4 (cli) (built: Jun 12 2005 23:14:24)です。
  • $Msg1が$Msg2に上書きされたような出力を返してきます。
回答を見る
  • ベストアンサー

クラスのメンバが上書きされる。

クラスのメンバーがなぜか上書きされてしまう事態になってしましいます。 以下はソースです。そのまんまです。 <?php $obj = new CMessegLog(); $obj->setMsg1("gogo"); $obj->setMsg2("toto"); echo $obj->$Msg1."\n"; echo $obj->$Msg2."\n"; class CJapanTotalMusic { var $msg1; var $msg2; function setMsg1($message) { $this->$Msg1 = $message; } function setMsg2($message) { $this->$Msg2 = $message; } } ?> これを実行すると下記のように、 $Msg1が$Msg2に上書きされたような出力を返してきます。 ----------------------- $ php MsgLog.php toto ※ gogoであってほしい。 toto           ----------------------- どうなっているんでしょうか? よろしくお願いします。 PHPの環境は PHP 5.0.4 (cli) (built: Jun 12 2005 23:14:24) Copyright (c) 1997-2004 The PHP Group Zend Engine v2.0.4-dev, Copyright (c) 1998-2004 Zend Technologies です。

noname#14448
noname#14448
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.1

添削してみました --------------- <?php class CMessageLog { var $Msg1; var $Msg2; function setMsg1($message) { $this->Msg1 = $message; } function setMsg2($message) { $this->Msg2 = $message; } } $obj = new CMessageLog; $obj->setMsg1("gogo"); $obj->setMsg2("toto"); echo $obj->Msg1."\n"; echo $obj->Msg2."\n"; ?>

noname#14448
質問者

お礼

$は変数の前に1回つければいいんですね。 デフォルトオブジェクトとか使ってたのに気づかなかった。 ありがとうございます。

関連するQ&A

  • クラスの中のクラスへのアクセス

    お世話になります。 クラスが以下のようにあります。 class ClassName1{ var $classname2_obj; // クラス「ClassName2」のオブジェクト function getClassName2Obj(){ return $this->$classname2_obj; } } class ClassName2{ var $array_list; // 配列です  function getArrayList(){ return $this->array_list; } } やりたいのは、ClassName1のgetClassName2Obj関数でClassName2の配列をgetArrayListで取得したいのです。 $a = new ClassName1; $b = $a->getClassName2Obj(); $c = $b->etArrayList(); 上の$b = … と$c = …の部分の処理を一行にまとめることはできないでしょうか? 何卒よろしくお願い致します。 PHPは5です。

    • ベストアンサー
    • PHP
  • クラスにおける、メンバー変数の「$」の有無について

    クラスについて学習中です。 テキストに載っていた、以下のサンプルスクリプトについて質問があります。 (他言語の方々へ。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」と変えても同じように動くんだよね?・・・何がなんだかわからなくなってきた。 という状態なのです。 どなたか、このモヤモヤっとした疑問を消してください。 お願いします。

  • クラスのメソッド

    inidat.phpに$global_a=3;と書いてありますがクラス内でこれが得られません。 <?php require_once 'inidat.php'; class test5 { var $a; function test5() { $this->a = 'inidat-a=' . $global_a; } } ?>

    • 締切済み
    • PHP
  • php4とphp5での数値の取り扱いの違い、指数形式にしたくない

    利用しているサーバのphpのバージョンがphp4からphpを5に変わる ことになり、動作させているスクリプトに移行用の変更を行って いるのですが、下記コードの部分の振る舞いがphp4とphp5で異な っていてphp5では動作しなくなってしまっています。 1 <?php 2 echo "start\n"; 3 $debStr=''; 4 $newid='00000006820000000000'; 5 $debStr .= "Line 5 id=".$newid."\n"; 6 $i = 0; 7 while (substr($newid,$i,1) == "0") { 8 $i++; 9 } 10 $j = 20 - $i; 11 $newid = substr($newid,$i,$j); 12 $debStr .= "Line 12 id=".$newid."\n"; 13 $newid = $newid + "1000000000"; 14 $debStr .= "Line 14 id=".$newid."\n"; 15 echo $debStr; 16 ?> をphp4で実行すると 1 [xxx@devxxx Test]$ php -v 2 PHP 4.4.8 (cli) (built: Feb 4 2008 16:46:07) 3 Copyright (c) 1997-2008 The PHP Group 4 Zend Engine v1.3.0, Copyright (c) 1998-2004 Zend Technologies 5 [xxx@devxxx Test]$ php msgid.php 6 start 7 Line 5 id=00000006820000000000 8 Line 12 id=6820000000000 9 Line 14 id=6821000000000 となるのですが php5で実行すると 1 [xxx@devxxx Test]$ php -v 2 PHP 5.2.6 (cli) (built: May 7 2008 11:01:30) 3 Copyright (c) 1997-2008 The PHP Group 4 Zend Engine v2.2.0, Copyright (c) 1998-2008 Zend Technologies 5 [xxx@devxxx Test]$ php msgid.php 6 start 7 Line 5 id=00000006820000000000 8 Line 12 id=6820000000000 9 Line 14 id=6.821E+12 実際のサーバ上でのphpバージョンは、 PHP 4.4.7と となり9行目の "id=6821000000000"が"id=6.821E+12"のように指数で の表示になり、idとして機能しなくなってしまいます。 どなたかphp5でもphp4と同じ結果を得る方法を教えていただけないで しょうか。 よろしくお願いします。

    • ベストアンサー
    • PHP
  • 引数の違うメソッド

    PHPで同名で引数の違うメソッドを作成したいのですが、可能でしょうか? <?php class Test { var $test_str = ""; function set($str){ $test_str = $str; //$this->$test_str = $str; // どちらでも良い? } function Test() { // 引数なし } function Test($str) { // 引数あり $this->set($str); } } $obj = new Test(); ?>

    • ベストアンサー
    • PHP
  • JavaScriptのグローバル変数

    JavaScriptのグローバル変数 次のプログラムで、(1)は p.obj1 = 32 と表示されるのに、 (2)はエラーになります。pはグローバル変数的にアクセスできる のに、なぜobj1がアクセスできないのかが分かりません。 詳しい方の解説をお願いします。 // test.js main(); function main() { F2(new F1(32, 100)); alert("p.obj1 = "+ p.obj1); // (1) alert("obj1 = "+ obj1); // (2) } function F1(obj1, obj2) { this.obj1 = obj1; this.obj2 = obj2; } function F2(p) { this.p =p; return this.p; } function alert(message) { WScript.Echo(message) }

  • クラスの中にある関数を使いたい

    次のようなクラスを使ってエレメントを作った時に、 マウスを重ねたらハイライト表示っぽくさせるために、 onmouseoverにこのクラスのメンバ関数setBackgroundColorをセットしたいのですが、 クラス内で使う時は先頭にthisが必要になると思います。 そのthisはどうやって取り出したら良いのでしょうか? それかこのやり方は間違っていて、別のやり方でやった方が良いのでしょうか? function TextObj(text) { //実体を作る var textNode = document.createTextNode(text); var spanElement = document.createElement("span"); spanElement.style.position = "absolute"; spanElement.appendChild(textNode); document.body.appendChild(spanElement); //オブジェクトへの参照を保存 this.obj = spanElement; } TextObj.prototype.setMouseOver = function() { this.obj.onmouseover = function(){ setBackgroundColor(255,255,255);←ここでこの関数を使いたい } } TextObj.prototype.setBackgroundColor = function(red, green, blue) { this.obj.style.backgroundColor = "rgb(" + red + "," + green + "," + blue + ")"; }

  • クラス、オブジェクト、インスタンスの理解で?

    お尋ねします。 既に、バリバリオブジェクト指向でプログラムを書いている方が多いので恐縮ですが、とあるサイトのオブジェクトのサンプルを使って、下記のようにサンプルソースを書いてみました。 --以下ソース--- <?php class Nerimono { private $name; public function __construct() { $this->name= 'ねりもの'; } public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } } $objectNerimono = new Nerimono(); $objectKamaboko = new Nerimono(); $objectKamaboko->setName('かまぼこ'); $objectHanpen = new Nerimono(); $objectHanpen->setName('はんぺん'); echo 'Nerimono オブジェクトの $objectNerimono 実体(インスタンス)を生成した。'; echo "\n"; echo '$objectNerimono の private $name に「' . $objectNerimono->getName() . '」と、既に書いたあった'; echo "\n"; echo 'Nerimono オブジェクトの $objectKamaboko 実体(インスタンス)を生成した。'; echo "\n"; echo '$objectKamaboko の private $name に「' . $objectKamaboko->getName() . '」と書いた'; echo "\n"; echo 'Nerimono オブジェクトの $objectHanpen 実体(インスタンス)を生成した。'; echo "\n"; echo '$objectHanpen の private $name に「' . $objectHanpen->getName() . '」と書いた'; echo "\n"; --ここまで--- そして、これの実行結果が下記です。 C:\Temp>php Nerimono.php Nerimono オブジェクトの $objectNerimono 実体(インスタンス)を生成した。 $objectNerimono の private $name に「ねりもの」と、既に書いたあった Nerimono オブジェクトの $objectKamaboko 実体(インスタンス)を生成した。 $objectKamaboko の private $name に「かまぼこ」と書いた Nerimono オブジェクトの $objectHanpen 実体(インスタンス)を生成した。 $objectHanpen の private $name に「はんぺん」と書いた このコメントのような解釈で、合っておりますでしょうか? 今までオブジェクト指向のメリットが全然理解できず、関数の変わった呼び出し方法としか、理解できていませんでした。 PHPは、本来のオブジェクト指向とは違うようだとは、知っているつもりです。(Pブジェクト思考?w) 間違っているところあれば、ご指摘ください。m(_。_)m PHPは、Ver 5.3.5 です。

    • 締切済み
    • PHP
  • PEARを使ったフェッチのしかた。

    いつもお世話になっています。 pear と phpを使ったclassを勉強しており 行き詰った点があったので教えてください。 **** class.php ************************ require_once("DB.php"); class DB_Class{ var $db_object;//DB::connectが入る var $db = "mysql"; var $db_user = "user"; var $db_host = "localhost"; var $db_name = "db_name"; var $pass = "pass"; function DB_Class(){ //コンストラクタ $db_string = $this->db."://".$this->db_user.":".$pass."@".$this->db_host."/".$this->db_name; $this->db_object = DB::connect($db_string); } } **** test.php ******************************** require_once("class.php"); $obj = new DB_Class(); $sql = "select * from TEST_TABLE"; $res = $obj->db_object->query($sql); while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)){ print("<td>".$row["TEST"]."</td>"); } class.phpファイルのメンバ変数 var $db_objectにDB::connectが入っており、 test.phpでfetchRowを使ってDBの内容を 取り出したいのですが、 fetchRowメソッドが見つからないというエラー がでます。 それまでのqueryメソッドまではエラーがなく 呼び出せます。 while($row =$res->fetchRow(DB_FETCHMODE_ASSOC)) ここを $res->$obj->db_object->fetchRowや $res->$obj->$this->DB_object->fetchRowや とにかく色々な方法を試してみたのですが うまくいきませんでした。 どなたかご教授お願い致します。

    • ベストアンサー
    • PHP
  • javascriptの変数をPHPの変数で受ける

    下記のようなjavascript において、グローバル変数clicked の値を PHPの変数$clickedで受けたいのですが、どうすれば受け取れるでしょうか? var_dump()してみると、undefinedや、NULLと表示されます。 要は、カレンダーの<td>要素をクリックしたときの日にちの番号を PHPの変数で受けたいのです。 echo '<tr id="calheader" bgcolor="#ffffcc">'; for($i=1; $i<=7; $i++){ echo '<td valign="top" align="center" class="smallText" id="'.$i.'" onclick="pusharea(this);">'.$i.'</td>'; <script language="javascript"> <!-- var clicked; // グローバル変数 function pusharea(obj){ clicked = obj.id; } // --> </script> </head> ----------------------------------------------- <script language="javascript"> alert(clicked); // <?php echo $clicked;?>=clicked; </script> <?php var_dump($clicked); echo '<tr>'; for($i=1; $i<=7; $i++){ /*if($i===$clicked)*/ echo '<td valign="top" height="50" align="center" class="smallText">'.$user.'</td>'; //else echo '<td valign="top" class="smallText">&nbsp;</td>'; } echo '</tr>';

専門家に質問してみよう