classの内部で$thisを参照する方法

このQ&Aのポイント
  • classの内部で$thisを参照するにはどうすれば良いでしょうか?
  • 他のObject言語ではできることができないため、困っています。
  • 出力結果としては、func1[a]func1_1[]が出力されますが、func1[a]func1_1[a]を希望しています。
回答を見る
  • ベストアンサー

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] よろしくお願いします

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

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

  • ベストアンサー
  • kotaron
  • ベストアンサー率61% (8/13)
回答No.1

以前、同じような疑問をもったので 少し調べてのですが、 PHP(Zend Engine1.5)では、名前空間を整える段階で、 functionの入れ子があると、メンバ関数内であろうと、 強制的に、クラス外に置かれ、普通の関数扱いにされてしまうみたいです。 当然、$this演算子も使用できないので、警告の対象になります。 func1_1()は通常の関数として扱われるので、引数などで明示的にメンバ変数を渡してやらないとアクセスできないと思います。 また、名前空間が通常の関数に属しますので、 通常関数のオーバーロードを許していないPHPでは、func1_1は通常関数の識別子としては再利用できません。 PHPの制限だと思って、他の方法を考えるしかないと思います。

noname#9903
質問者

お礼

やっぱり 無理ですか。 どうしても普通の場所に宣言したくなかったので・・・ global変数使いたくなかったのですが メモリの無駄になったり、わけわからなくなるので あまりやりたくないのですが 一時的な作業用の変数を func1で global で宣言追加してそこにコピーして func1_1もglobal で宣言いれて 共通の変数で アクセスして結果作るようにしました。 70行程度で簡易テンプレートクラス作っていたもので とりあえず、置換する部分までできました あとは、読み込み関数LoadFromFileを classにくっつけたら完成です。 お返事ありがとうございました。

関連するQ&A

  • PHP 5.2.5で class内のfunctionから

    <?php class other_class{ static $short = 5; function shortcut(){ $this -> short = "ららら"; } }//class print other_class::$short;//ららら になるように ?> PHP 5.2.5で $this -> short を使おうとすると Fatal error: Using $this when not in object context in C:\***\***\***.php on line 7 エラーが出ます。 $short に function shortcut() から "ららら" を入れるにはどう書けばいいでしょうか? よろしくお願いします。m(_ _)m

    • ベストアンサー
    • PHP
  • JavaScript thisとvarの違い

    以下のスクリプトをRhino 1.7 で実行しました。 var a = 1; this.a = 2; function MyFunc() { var a = 3; this.a = 4; print(a); } var func = new MyFunc(); print(a); print(this.a); print(func.a); 結果は以下の通りです。 3 2 2 4 1行目と4行目の結果が違います。 トップレベル(2と3行目)ではthisとvarの値が同じなのに1と4行目の値が違うのは、どのような理由でしょうか? JavaScriptの動作から含めて、教えていただければ幸いです。 よろしくお願いします。

  • [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関数を定義できるのでしょうか。

  • setTimeoutのthis参照について

    prototypeメソッドの中でsetTimeout関数を使用したところ、thisで自身の関数を参照しなくなりました。setTimeoutの挙動についてぐぐってみたのですが、いまいちsetTimeoutを使用したときのスムーズな記述方法がわかりません。 ******************************** var hoge=function(){ this.myName="ほげ"; } hoge.prototype={ init:function(){ setTimeout(function(){ hoge.prototype.displayName(); // ★(1)setTimeout関数の中でのメソッドの適した呼び出し方は? // ↑の記述でも呼び出せるけど、間違ってる気がする。。 },1000) }, displayName:function(){ // ★(2)ここでhogeオブジェクトのmyNameプロパティを参照するにはどう記述すれば良いのか? //console.log(this.myName); //↑setTimeoutを使ったのでthis参照はwindowオブジェクトになっているから違う //console.log(hoge.myName); →undefinedを返す } } window.onload=function(){ var a=new hoge(); a.init(); } ******************************** 上記のようなprototype関数を使用したときのスムーズな記述方法を教えていただけませんでしょうか。 知りたいのは下記2点です。 ★(1)prototypeメソッドを使用したとき、setTimeout関数の中でのメソッドの適した呼び出し方は? ★(2)setTimeout関数内で呼び出したメソッドから、自身のオブジェクトのプロパティを参照するにはどう記述すれば良いのか? 初心者なので説明が下手だったり、質問内容で間違った記述があるかもしれません。 質問内容で問題がありましたらご指摘いただけると助かります。

  • function内でメンバー変数を作れる?

    ActionScriptのオブジェクトスクリプトは初めてで、ActionScript2.0で制作しようとしています。 クラス内での変数の扱い方が解らずはまっています。 class Sample{ var temp:Array = Array(); function Func_01(key, val){ this.temp[key] = val; } 上の二行目メンバー変数tempを定義する部分をFunc_01内で行うことはできないのでしょうか? やりたいことは、外部テキストファイルを読み込み、中身によって持つメンバー変数を変えたいだけです。例えば 外部テキストより sample=key_A>>>1,key_B>>>2,key_C>>>3,key_D>>>4 を読み込み sample['key_A']=1; sample['key_B']=2; sample['key_C']=3; sample['key_D']=4; のように','と'>>>'でsplit等を利用し連想配列にして利用したいのですが、function内で読み込んだ値をメンバー変数にできずはまっています。お解りの方ご教授願います。

    • ベストアンサー
    • Flash
  • phpでオブジェクト化に挑戦中です。配列がうまく扱えません。

    このようなサンプルプログラムを作ってみました どうやら配列がまずいようなのですが、どうすればよいでしょうか。 <?php class TEST2{ var $b1; } class TEST{ var $a1=TEST2; function printout(){ $this->$a1[0]->b1='123 '; $this->$a1[1]->b1='abc '; $this->$a1[2]->b1='DEF '; } } $c = new TEST; $c->printout(); echo $c->$a1[0]->b1; echo $c->$a1[1]->b1; echo $c->$a1[2]->b1; ?> ちなみに出力結果は DEF DEF DEF となりました。 疑問1.なぜ全部同じ結果になるのか 疑問2.配列だと echo $c->$a1[2]->b1; のように、$a1と、$マークがないと動かない。$を取ると強制終了される。 お願いします。へんてこな質問ですみません。

    • 締切済み
    • PHP
  • 自分への参照を保持

    わからないことがあるので、教えてください。 以下のようなクラスがありました。 class Mover extends MovieClip{ var targetMC:MovieClip var objectRef:Object; var xVel:Number; var yVel:Number; function Mover(targetMC:MovieClip,xVel:Number,yVel:Number){ this.targetMC=targetMC this.targetMC.objectRef=this; this.xVel=xVel; this.yVel=yVel; } function updatePosition(){ this._x+=this.objectRef.xVel; this._y+=this.objectRef.yVel; } function startMoving(){ this.targetMC.onEnterFrame=this.updatePosition; } } わからないのは、コンストラクタの中の this.targetMC.objectRef=this; です。 これはMoverクラス自身を参照してるんですか?targetMCのことなんでしょうか・・・。 このあたりがよくわからないので、わかりやすく教えてください。 よろしくお願いします。

    • ベストアンサー
    • Flash
  • 呼び出し方でthisが変わる

    var A=new function(){this.a=function(){alert(this===window)}}; A.a();(A&&A.a)() A.aの1回目の呼び出しではfalse,2回目の呼び出しではtrueとなるのですがどうしてそうなるのかが分かりません。分かる方がいましたらご教授よろしくお願いします

  • イベントリスナーの部分を関数にしたい

    イベントリスナーの部分で、「load」以外に「change」も必要になったので関数にしたいのですが、 引数の関数の指定方法がわかりません。 どうすればいいのでしょうか。よろしくお願いします。 【イベントリスナーを関数にする前】 function hoge(){ this.view = function(){ var _this = this; window.addEventListener( 'load',function(){ _this.foo()}, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view(); 【やってみたこと】 function hoge(){ this.view = function(){ var _this = this; var func = function(){ _this.foo()}; this.addListener( 'window', 'load', func ); } this.addListener = function(elem,type,func){ elem.addEventListener( type,func, false ); } this.foo =function(){ var txt = document.createTextNode( this.moji ); document.body.appendChild( txt ); } } var a =new hoge(); a.moji="テスト"; a.view();

  • function内で変数 this[lcr+"_map"]を使いたい

    var lcr = "Left"; map(lcr); function map(lcr) { var Left_map = new Array("ba","rc","ba","re","be","wa"); trace(this[lcr+"_map"]);// undefined trace(Left_map);//ba,rc,ba,re,be,wa } function内で this[lcr+"_map"] を使いたいのですが、function内だと undefined になってしまいます。 どうすればfunction内でも this[lcr+"_map"] が使えるようになりますか? よろしくお願いします。

    • ベストアンサー
    • Flash

専門家に質問してみよう