2

$thisPHPで変数を設定または変更する方法はありますか? 私の場合、$this必ずしも呼び出しを行ったクラスではないクラスを参照する匿名関数を呼び出す必要があります。

擬似:

function test() { 
    echo $this->name;
}

$user = new stdclass;
$user->name = "John Doe";

call_user_func(array($user, "test"));

: 実際には、この関数は、グローバル スコープのメソッドではなく、このオブジェクトに存在するオブジェクトとメソッドを含む配列を想定しているため、エラーが発生します。

4

2 に答える 2

6

オブジェクトをパラメーターとして受け入れるように関数定義を設定してみませんか? 例えば:

function test($object) {
    if (isset($object->name)) // Make sure that the name property you want to reference exists for the class definition of the object you're passing in.
        echo $object->name;
    }
}

$user = new stdclass;
$user->name = "John Doe";

test($user); // Simply pass the object into the function.

変数 $this は、クラス定義で使用される場合、クラスのオブジェクト インスタンスを参照します。クラス定義の外 (または静的メソッド定義内) では、変数 $this は特別な意味を持ちません。$this を OOP パターンの外で使用しようとすると、意味が失われ、OOP パターンに依存する call_user_func() は、試みたようには機能しません。

非 OOP の方法 (グローバル関数など) で関数を使用している場合、関数はクラス/オブジェクトに関連付けられておらず、非 OOP の方法 (データを渡すか、グローバルを使用) で記述する必要があります。

于 2013-07-15T01:28:16.440 に答える
5

特定のコンテキストでの意味を変更するために、クロージャ オブジェクトでbindメソッドを使用できます。thisこの機能は PHP 5.4 で利用可能になったことに注意してください。

公式説明

特定のバインドされたオブジェクトとクラス スコープを持つクロージャを複製します

  class TestClass {
       protected $var1 = "World";
  }
  $a = new TestClass();

  $func = function($a){ echo  $a." ".$this->var1; };
  $boundFunction = Closure::bind($func, $a, 'TestClass');

  $boundFunction("Hello");

  // outputs Hello World

この構文の代わりに、クロージャ (無名関数) のインスタンスの bindTo メソッドを使用します。

  class TestClass {
       protected $var1 = "World";
  }
  $a = new TestClass();

  $func = function($a){ echo  $a." ".$this->var1; };
  $boundFunction = $func->bindTo($a, $a);

  $boundFunction("Hello");

  // outputs Hello World

あなたの例では、関連するコードは次のようになります

$test = function() {
    echo $this->name;
};

$user = new stdclass;
$user->name = "John Doe";

$bound = $test->bindTo($user, $user);
call_user_func($bound);
于 2013-07-15T01:58:46.763 に答える