オブジェクト参照渡しと参照渡しの違いを確認する簡単なサンプルコード

このQ&Aのポイント
  • オブジェクト参照渡しと参照渡しの違いを確認するために、簡単なサンプルコードを作成します。
  • まず、オブジェクト参照渡しの場合、$aと$bが同じIDを持つコピーとなります。
  • 一方、参照渡しの場合、$cと$dは参照となります。
回答を見る
  • ベストアンサー

「オブジェクト参照渡し」と「参照渡し」の違いを

▽PHP: オブジェクトと参照 - Manual   http://jp.php.net/manual/ja/language.oop5.references.php $a = new A; $b = $a; // $a と $b は同じ ID を持つコピーです // ($a) = ($b) = <id> $c = new A; $d = &$c; // $c と $d は参照です // ($c,$d) = <id> とありますが、 ($a) = ($b) = <id> ($c,$d) = <id> の違いを目で見て確認できるような簡単なサンプルコードはないでしょうか? echoとかで中身を出力して、確かに違っているな、と言うのを確認してみたいのですが……

  • re97
  • お礼率80% (601/744)
  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • mpro-gram
  • ベストアンサー率74% (170/228)
回答No.1

「参照」というのは、メモリ上の地番のことで、phpでは「シンボルテーブルのエイリアス」と記述されています。 http://jp.php.net/manual/ja/language.references.whatare.html 「シンボルテーブル」ってのは、云ってみれば本の目次のようなもの。 「エイリアス」はデータ格納場所(本の各ページ)の名前 <?php $a = new A(); /* ここで、new という操作によって、オブジェクトが作成されて、オブジェクト格納場所を示す#id という名前(これがオブジェクト参照)が $a の内容として格納されます。  */ $b=$a ; var_dump($a,$b); /* これは、変数内容をコピーします。 // $bの格納場所は、$a と違うところにあるけど、中身のオブジェクトを指すための #id は同じ  */ $c= &$a; var_dump($a,$b,$c); /* リファレンス記号& により、$aの格納場所(参照)を $c の格納場所として、目次に書き込みます。 // よって $c は、$aと同じ格納場所の中身を見て動作します。  */ $a = 12; var_dump($a,$b,$c); /* $aは 12、$bは元のオブジェクトidのまま、$cは$aと同じ格納場所をみてるので 12 になる  */

re97
質問者

お礼

回答ありがとうございましたー

関連するQ&A

  • オブジェクトの参照渡しについて

    メソッドの引数にオブジェクトを指定した場合、 それは「参照渡し」だと理解していました。 でも以下のプログラムでは、指定したオブジェクトに変化がありません。 public static void main(String[] args) { BigDecimal b = new BigDecimal(1); System.out.println(b); test(b); System.out.println(b); } public static void test(BigDecimal b) { b = new BigDecimal(2); } 出力は以下です。 ------------------------- 1 1 ------------------------- どういうことでしょうか? 正しい知識をお教えください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • オブジェクト参照のメリット

    例) Object a ,b; a = new Object(); b = a; オブジェクト参照を利用してどのようなメリットがあるのでしょうか? 宜しくお願いします。

    • ベストアンサー
    • Java
  • PHP5での参照渡しについて

    お世話になっております。 3点質問させて下さい。 1.PHP5での参照渡しについて PHP5では、参照渡しがデフォルトという記事を読んだのですが、classを使わず、以下のようにfunctionのみで記述した場合、参照渡しになっている気配がありません。 - $test = "テスト"; function a($a){ $a = "参照渡し"; } a($test); echo $test; - 結果:テスト &$aとすると参照渡しになりますが、classを使わない場合はPHP5のデフォルトが参照渡しというのを意識する必要は無く、&を用いた参照渡しを利用する形で良いのでしょうか? 2.オブジェクトについて オブジェクト=class だと思っても良いのでしょうか? また、独立した関数では無く、classを利用した方が良い場面というのはどういう時なのでしょうか? classやオブジェクト指向というものへの私の理解が足りてない事でこのような疑問を抱く事になっていると思います。 classやPHP5のオブジェクト指向について学習するのに便利な書籍やサイトなどあれば紹介して頂けないでしょうか? 3.$_POSTや$_GETについて 他の方のソースを見ていると、何かの処理後にPOSTの値を別の変数に入れている方が多いように思えます。 私もそれにならってPOSTの値をいじる場合は、 変数 = 関数($_POST["test"]); とするようにしています。 ですが、 $_POST["test"] = 関数($_POST["test"]); とするのは何か都合が悪い事があるのでしょうか? 要領を得ない質問で申し訳ありませんが、回答頂けましたら嬉しいです。

    • ベストアンサー
    • PHP
  • 生成されるStringオブジェクトは2つ3つ??

    http://www.okweb.ne.jp/kotaeru.php3?q=716958 以前質問した内容について、またわからなくなりました。 「STRINGオブジェクトはいくつ作成されますか? String a,b,c; a="1234"; b=a; c=a+b; 」 で、答えはA=B="1234"のひとつと c="12341234"のひとつで、計2つ、ということなんですが・・・ たとえばOkwebクラスがあったとして Okweb ok = new Okweb(); Okweb goo = ok; この場合には生成されるオブジェクトは1つというのはわかります。 gooにも参照が渡されたというだけで、あくまでもひとつということですよね。それは、okに変化があったとき同時にgooも変化することでわかります。 ここで例の問題に戻ります。 加えて b="5678"; として確認(println等で)してみますと、 a="1234",b="5678" となっています これは a=b=1234ではなくて a=1234 b=1234 というようにあくまでもaとbは違うStringオブジェクトであるということを示しているといえないのでしょうか? よろしくお願いします教えてください

    • ベストアンサー
    • Java
  • vbaで参照設定

    Dim Ref As Reference 'Excel Set Ref = References.AddFromGuid("{00020813-0000-0000-C000-000000000046}", 1, 7) 'ADODB Set Ref = References.AddFromGuid("{2A75196C-D9EB-4129-B803-931327F72D5C}", 2, 8) このような感じで、vbaで参照設定をしているのですが、 Microsoft Forms 2.0 Object Library へ、vbaで参照設定をしたい場合、どうなりますか? 今は、 http://www.moug.net/tech/acvba/0020034.html のやり方で手作業で参照設定していますが、 vbaでのやり方が知りたいです。 {00020813-0000-0000-C000-000000000046}", 1, 7 こういうコードの調べ方がわかりません。

  • フレーム間オブジェクト参照

    フレームを使ったページで、 親フレームの中に、A,Bという2つのフレームを作り、 直接AのURLを入れても、エラーを出したいのですが、 どういう作りをしたら良いのでしょうか? 親フレームから見ないとエラー(警告ページに飛ぶなど) にしたいのです。 フレームAから、 フレームB内のテキストボックスを参照できるか否かの ような形でフレームBの存在を知ろうと思ったのですが、 Nullかオブジェクトがないとか言われるので処理が中断 してしまいます。 JavaScriptでオブジェクトの値を参照した時に、オブジェクト がないとかの判断ができるプロパティ等があればいいのですが。 JavaScriptでできますでしょうか?

  • PHPの参照渡しについて

    以下のようなコードがあったとき $obj = new stdClass(); $foo = $obj; この場合、動作は いわゆる【参照の値渡し】というとらえかたでよいのでしょうか? 変数$obj には、 new stdClass();という記述によって 新規に作成されたオブジェクトの参照(※正確には別のメモリ内に保持されたオブジェクトのアドレス) が保持されるわけですよね? そのとき $foo = $obj; というコードは$objが保持するオブジェクトのアドレス値を$fooという変数にも コピーするという動作を意味するわけですよね。 この場合、両変数を用いて生成されたオブジェクトのプロパティなどの状態を 共有することとができます。 しかしながら変数$fooに別の値、例えば文字列を代入すうると $foo = "文字列"; とすると$fooの値が変更され$objの値は変更されません。 対して、次のようなコードがあった場合 $foo = &$obj; というコード、これはPHPにおける参照渡しですが、 この場合は$objが指し示す、オブジェクトが保持されているメモリ上のアドレスではなく そのメモリ上に確保された変数$objそのもののアドレスが$fooという変数にコピー? されるのでしょうか? この明示的な参照渡しだと、オブジェクトの状態を共有するのはもちろん $foo = "オブジェクト破棄"; と片方に文字列を代入すると print $obj; 同様に文字列にかわってしまいます。 この本来の意味?であろう参照渡しとは実際 $fooに変数$objそのもののアドレスが保持されるという 解釈でよいのでしょうか? おくわしいかたご教授ください。

    • ベストアンサー
    • PHP
  • javascriptでのオブジェクト参照について

    asp.netを使用しています。 javascriptで半角カナが入力されたら、アラートを出す処理を行いたいと思っていて、以下のようなプログラムをネットで拾ってきました。やりたいことはこれで可能なのですが、問題が...。 javascript部分とhtml部分を分けて、 <script language="JavaScript" src="kana_check.js"> </script> 汎用性が高い処理ですので、外部ファイルとして読み込んで使用したいと考えています。 ですが、script部分を外部ファイルに分けて、読み込んで使用しようとすると、「オブジェクトを指定してください」というエラーが出てしまいます。恐らく、オブジェクト参照がうまくできていないのだと思うのですが、どういう風に指定していいのかが分かりません。 (以前も、同じくオブジェクト参照について質問した事があるのですが、今回もどうしていいものか...) ご教授いただけないでしょうか?よろしくお願い致します。 <html> <head> <title></title> <script> <!-- function hkCheck(myFIELD){ baseStr=myFIELD.value; for(i=0;i<baseStr.length;i++){ var targetStr=baseStr.charAt(i); if(targetStr>="。"&&targetStr<="゜"){ alert("半角カナは使用できません"); myFIELD.focus(); return ; } } } --> </script> </head> <body> <form runat="server"> <input type="text" size="16" id="tb_a" name="tb_a" onBlur="hkCheck(this.form.tb_a)" runat="server" /><br> <input type="text" size="16" id="tb_b" name="tb_b" onBlur="hkCheck(this.form.tb_b)" runat="server" /><br> </form> </body> </html>

  • コンストラクタで参照渡しをする理由

    すでに質問済みの内容でしたら申し訳ありません。 php4を使用していまして、 HTML_QuickFormとSmartyを最近使い始めました。 ネットや書籍のサンプルコードを見ながら使用しているのですが、 $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty); 上記のような場合や フォームのコンストラクタ呼び出しの場合に =&を使用している意味が理解できません。 ・=&はオブジェクトの参照渡しという認識で合っていますでしょうか? ・参照渡しであった場合、実態を渡すのでなく参照で渡すべき理由とは何でしょうか? ご教授願えれば幸いです。 よろしくお願い致します。

    • ベストアンサー
    • PHP
  • クラス、オブジェクト、インスタンスの理解で?

    お尋ねします。 既に、バリバリオブジェクト指向でプログラムを書いている方が多いので恐縮ですが、とあるサイトのオブジェクトのサンプルを使って、下記のようにサンプルソースを書いてみました。 --以下ソース--- <?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

専門家に質問してみよう