- ベストアンサー
コンストラクタで参照渡しをする理由
すでに質問済みの内容でしたら申し訳ありません。 php4を使用していまして、 HTML_QuickFormとSmartyを最近使い始めました。 ネットや書籍のサンプルコードを見ながら使用しているのですが、 $renderer =& new HTML_QuickForm_Renderer_ArraySmarty($smarty); 上記のような場合や フォームのコンストラクタ呼び出しの場合に =&を使用している意味が理解できません。 ・=&はオブジェクトの参照渡しという認識で合っていますでしょうか? ・参照渡しであった場合、実態を渡すのでなく参照で渡すべき理由とは何でしょうか? ご教授願えれば幸いです。 よろしくお願い致します。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
がると申します。 ちと興味もあり、実験してみたのですが。 PHP4において、=&でnew演算子の結果を受け取っても「何の意味もない」みたいです。 具体的には ・new演算子で=&でインスタンスを受け取る ・関数の引数で、&なしでインスタンスを設定する ・関数の宣言にも&なしにする で「別インスタンスがcopyされている」事を確認、また、 ・new演算子で=でインスタンスを受け取る した後に ・関数の引数で、&でインスタンスを設定する または ・関数の宣言で&にする とすることで普通に参照で渡されることを、それぞれ確認しました。 或いは過去の流儀とかいくつかあるのかもしれませんが、PHP4.3.10以降のいくつかのテスト(4.3.10、4.3.11、4.4.1、4.4.2、4.4.3、4.4.4)で、上述の結果がでています。 参考までに。
その他の回答 (2)
- php504
- ベストアンサー率42% (926/2160)
ちなみにマニュアルからの引用ですが ----------------------------------- PHP 5 以降、new は自動的にリファレンスを返すようになりました。そのため、この場面で =& を使用することは非推奨となり、 E_STRICT レベルのメッセージが表示されるようになりました。
お礼
早速のご回答ありがとうございます。 >PHP 5 以降、new は自動的にリファレンスを返すようになりました。 勉強不足でした。お恥ずかしい限りです。 php4→php5の違いという内容で様々な所で記述されていました。 ありがとうございました。
- chie65536
- ベストアンサー率41% (2512/6032)
newでコンストラクタを呼び出すとオブジェクトが生成され、その生成されたオブジェクトのポインタ(アドレス)が返されます。 実体はnewにより既に作られているので、その実体のポインタ(アドレス)を変数に保持しておけば良いのです。 参照渡しではなく実体渡しをして、変数に実体を代入(実体のコピー)してしまうと、newで作られた実体と、変数の実体は別物になってしまいます。この状態では、不要になった時に変数の方の実体は破棄出来ますが、newで作られた実体はアドレスが失われている為に破棄出来ません。それ以前に、実体が2つになってしまいメモリが無駄です。
お礼
早速のご回答ありがとうございます。 >不要になった時に変数の方の実体は破棄出来ますが、newで作られた実体はアドレスが失われている為に破棄出来ません。 なるほど、理解できました。 >それ以前に、実体が2つになってしまいメモリが無駄です。 仰る通りですね。 コーディング(製造)や設計上で、リソースの節約以外に 参照渡しにする事でのメリットのようなものはあるのでしょうか? お時間がある時にでもご教授頂ければ幸いです。
お礼
返信が遅くなってしまい申し訳ありません。 ご回答ありがとうございます。 >PHP4において、=&でnew演算子の結果を受け取っても「何の意味もない」みたいです。 本文を拝見しました。 意外な結果が出るんですね。 やはりPHP4はオブジェクト指向が弱いからという所で落ち着きそうでしょうか。 ご回答ありがとうございました。
補足
ご回答頂きました皆様。 ありがとうございました。 質問を締め切らせて頂きます。 全ての方にポイントを出したいのですが、 システム上そうはいかないのでご了承頂きたいです。 ありがとうございました。