• ベストアンサー

参照渡し に関する質問

初歩的な質問ですみません。下記の構文の違いと使用例など教えていただけると助かります。 質問1 function func_a(&$a){ } func_a($a); と function func_b($a){ } func_b(&$a); の違い。 質問2 $a = new aclass(); と $a =& new aclass(); の違い。 よろしくお願いいたします。

  • PHP
  • 回答数1
  • ありがとう数1

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

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

質問1についてですが 使用例としては特に区別はないのでどちらも同じです。 ただ後者の場合はPHPの設定によりエラーになる場合があります。 php.iniで allow_call_time_pass_reference = Off にしていると呼び出し時の参照渡し(後者の例)が出来なくなりますので参照渡しの引数は関数の定義時(前者の例)にしないといけません。 質問2ですが $a = new aclass( ); の場合、クラスのコピーが作成され、それが$aとして使われます。 大きなクラスの場合はコストのかかる処理です。 そのため $a =& new aclass( ); として時間とメモリの無駄を省くプログラムが多くありました。 PEARのライブラリでも =& が多く使われています。 ところがPHP5になりコピー渡しの処理が改善されクラスの参照渡しは推奨されなくなりました。 実際に$a =& new aclass( );とするとSTRICTエラーが出るようになりました。 PHP5以降であれば $a = new aclass( ); と書いたほうがいいでしょう。

hyakuichi
質問者

お礼

大変参考になります。 ありがとうございました。もやもやが解消しました。

関連するQ&A

  • globalと参照渡しはどちらが良いですか?

    関数内で変数を変更しないなら、global 関数内で変数を変更したいなら、参照渡し になるのでしょうか? 下記では、どちらも速度的には変わらないでしょうか? function a(){ global $smarty; } function a(&$smarty){ }

    • ベストアンサー
    • PHP
  • 「オブジェクト参照渡し」と「参照渡し」の違いを

    ▽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とかで中身を出力して、確かに違っているな、と言うのを確認してみたいのですが……

    • ベストアンサー
    • PHP
  • classのなかのfunctionの中のそのまたfuntionの中で$thisを参照するには?

    classのなかのfunctionの中のそのまたfuntionの中で$thisを参照するには? どうするのでしょうか? 他のObject言語でできることができないので???状態です class Sample { var $a = "a"; function func1() { function func1_1() { echo "func1_1[".$this->a."]"; } echo "func1[".$this->a."]"; func1_1() ; } } $c = new Sample; $c->func1(); -- 出力結果 func1[a]func1_1[] ほしい結果 func1[a]func1_1[a] よろしくお願いします

    • ベストアンサー
    • PHP
  • VB2005での関数への配列の参照渡しの方法

    Visual Basic 2005で、 =============================================================== Function func(ByVal a As Integer, ByRef b() As Integer) As Integer  a += 1 : b(0) = 1 : b(1) = 2 : b(2) = 3 Return 0 End Function ============================================================== という関数があったとしてメインのプロシージャに ================================================================ Dim c As Integer Dim d As Integer Dim e() As Integer = Array.CreateInstance(GetType(Integer), 10) d=7 c = func(d, e) ================================================================ と書き入れると結果はd=7(∵値渡し)、e(0)=1,e(1)=0,e(2)=0(∵参照渡し)となってしまうと思います。 e(0)=1,e(1)=2,e(2)=3としたい場合はどのように記述すればよいのでしょうか?

  • [JS] private関数からオブジェクト参照

    JavaScriptにて外部から使用する関数をpublicに、内部的に使用するだけの関数をprivateにしたく、 <http://d.hatena.ne.jp/brazil/20051028/1130468761>や<http://www.findxfine.com/programming/javascript/59.html>を参考に以下のようにしてみました。 func1はtestクラス内からしか呼び出せず、privateになっており、 func2はtestクラス外からも呼び出せて、publicになっているようです。 しかし、func2からfunc1を呼び出した際に、func2の呼び出しもとのオブジェクトを参照しようとすると undefinedになってしまいます。 var a = new test(); //a.func1(); // これはprivateなのでエラー a.func2(); // こちらはpublicなのでOK function test(){ var self = this; // private variable var data1 = 1; // public variable this.data2 = 2; // private function function func1(){ console.log(data1); // 1を表示 console.log(this.data2); // これがundefinedとなってしまう } // public function this.func2 = function(){ console.log(data1); // 1を表示 console.log(this.data2); // 2を表示 func1(); }; } どのようにすれば、オブジェクト変数を参照でき、 クラス内でのみ使用可能なprivate関数を定義できるのでしょうか。

  • 値渡しと参照渡しについて

    テンプレートについて調べているときに以下のような使用例がありました。 例)template<class T> T max(const T& a, const T& b) { return ( a > b ) ? ( a ) : ( b ); } これの説明に、「引数を参照にすることで、インスタンスを渡した場合の処理時間の短縮になる」と書かれていたのですが、どうして処理時間が短縮されるのでしょうか? また、実際に目で見える形で証明する方法はありますでしょうか。 ちなみに自分はC++についてはまだ初心者です。 どうか皆様のアドバイスをよろしくお願い致します。

  • ExelVBAで参照渡し

    こんばんは。またお世話になります。m(_ _)m 土・日を利用してVBAを学習しようと参考書を買ってきたのですが、基本構文について載ってなかったので質問します。 Sub Main() subject1(Range("A1:B2")) End Sub Sub subject1(arg As Range 上の式にてエラーが出る為ヘルプを参照したところ、どうも Range()が返すオブジェクト参照を Sub subject1(argument As Range) で受けられないようだと分かったのですが、ではどうやって参照を渡せば良いのかが分かりません。 VBは触った事がなく、初歩的かと思いますが、どなたか教授願えませんでしょうか。また、どこか参考になるサイトを教えて頂ければ助かります。

  • bccでエラー:メンバー関数は呼び出すかそのアドレスを~

    クラスのメンバ関数を、ある関数(実は qsort)の引数として渡したい と思っています。環境は OS:Windows XP コンパイラ:C++Builder6 に付属の bcc32.exe です。 下記のコード(t.cpp)をコマンドプロンプトで bcc32 t としてコンパイルすると「※1」の行で下のエラーになります。 「エラー E2235 t.cpp 29: メンバー関数は呼び出すか  そのアドレスをとらなければならない(関数 main() )」 どのように直せば良いでしょうか? -------------------------------------------------------- #include <stdio.h> #include <stdlib.h> class Aclass { public: void f(int); }; void Aclass::f(int x) { printf("classfunc %d\n", x); } void sub1(int x) { printf("sub-1 %d\n", x); } void call_func(void(*func)(int), int x) { func(2*x + 1); } void main(void) { call_func((void(*)(int))sub1, 11); Aclass *a = new Aclass; call_func((void(*)(int))a->f, -7); //※1 delete a; } -------------------------------------------------------- この掲示板、行頭の空白が削除されてしまいますねー。

  • javascript 値渡し?参照?

    javascriptの値渡しについて勉強中なのですが、質問です。 ----------------------------------------------------------------- function aaa(a,b){ var ttt = a ; a = b ; b = ttt ; } var a1 = 1 ; var a2 = 2 ; aaa (a1,a2) ; document.write(a1 ,a2); ------------------------------------------------------------------- 上記のようなコードで引数の値が交換できると思うのですが、正しくは出来ないようです。 1,0と出力されてしまいます。 どうしてなのでしょうか。 お聞きしたいのは、 ・この引数は値渡しなのか、参照なのか。 ・どうして出来ないのか詳しい理由。 よろしくお願いします。

  • 処理のしくみがわかりません・・・

    以下のスクリプトはfor文による繰り返し処理の例です。 <script type="text/javascript"> <!-- var a="あ"; var b=new Array("い","う","え","お"); function FUNC1(){ for(i=0;i<b.length;i++){ a=a+b[i]; } document.write(a); } function FUNC2(){ for(i=0;i<b.length;i++){ document.write(a=a+b[i]); } } //--> </script> FUNC1の関数を実行すると、「あいうえお」、 FUNC2の関数を実行すると、「あいあいうあいうえあいうえお」 と表示されるのは理解できます。 それで試しにこのスクリプトの最後に、 FUNC1()+FUNC2(); を追加したところ、 「あいうえおあいあいうあいうえあいうえお」 と表示されると思いきや、 「あいうえおあいうえおいあいうえおいうあいうえおいうえあいうえおいうえお」 と表示されました。 どうもFUNC2を足す時、グローバル変数 a が "あ" ではなく、 "あいうえお" と代入されて実行されてるみたいです。 そして、FUNC1、FUNC2を実行すると、それぞれ 「あいうえおいうえおいうえお」 「あいうえおいうえおいあいうえおいうえおいうあいうえおいうえおいうえあいうえおいうえおいうえお」 と、理解不能の文字の並びになってしまいました。 なぜ FUNC1()+FUNC2(); を追加したらそれぞれの関数の実行値が変わってしまったのでしょうか? その処理の仕組みをご教授お願いいたします<(_ _)>