2

次のコードを検討してください。これは、コールバック関数をメンバーとして格納し、それを使用するスキームです。

class MyClass {
  function __construct($callback) {
    $this->callback = $callback;
  }

  function makeCall() {
    return $this->callback();
  }
}

function myFunc() {
  return 'myFunc was here';
}

$o = new MyClass(myFunc);
echo $o->makeCall();

私はエコーされることを期待myFunc was hereしますが、代わりに次のようになります:

Call to undefined method MyClass::callback()

ここで何が間違っているのか、そして望ましい動作を得るために何ができるのかを誰かが説明できますか?

念のため、私は PHP 5.3.13 を使用しています。

4

3 に答える 3

3

makeCallメソッドを次のように変更できます。

function makeCall() {
  $func = $this->callback; 
  return $func();
}
于 2012-08-26T15:32:42.007 に答える
2

文字列として渡し、call_user_funcで呼び出します。

class MyClass {
  function __construct($callback) {
    $this->callback = $callback;
  }

  function makeCall() {
    return call_user_func($this->callback);
  }
}

function myFunc() {
  return 'myFunc was here';
}

$o = new MyClass("myFunc");
echo $o->makeCall();
于 2012-08-26T15:35:33.560 に答える
2

PHP の重要な点の 1 つは、シンボルの内容ではなく構文を使用してシンボルの型を認識することです。そのため、何を参照するかを明示的に記述する必要があります。
多くの言語では、次のように書くだけです:

myVariable
myFunction
myConstant
myClass
myClass.myStaticMethod
myObject.myMethod

また、パーサー/コンパイラーは、それぞれのシンボルが何を意味するかを知っています。これは、シンボルに割り当てられているものを知るだけで、シンボルが何を参照しているかを認識できるためです。
ただし、PHP では、どの「シンボル名前空間」を参照しているかをパーサーに知らせるために構文を使用する必要があるため、通常は次のように記述します。

$myVariable
myFunction()
myConstant
new myClass
myClass::myStaticMethod()
$myObject->method()

ただし、ご覧のとおり、これらは参照ではなく呼び出しです。PHP で関数、クラス、またはメソッドへの参照を渡すには、文字列と配列を組み合わせた構文が使用されます。

'myFunction'
array('myClass', 'myStaticMethod')
array($myObject, 'myMethod')

あなたの場合、 myFunc の代わりに' myFunc 'を使用して、関数への参照を渡し、 myFunc定数の値を取得していないことを PHP に知らせる必要があります。

もう 1 つの問題は、$myObject->callback() を記述すると、PHP は括弧のためにcallbackがメソッドであると想定し、プロパティをループアップしようとしないことです。
期待される結果を得るには、プロパティコールバックのコピー/参照をローカル変数に格納し、次の構文を使用する必要があります。

$callback = $this->callback;
return $callback();

ドル記号と括弧があるため、クロージャーとして識別されます。または call_user_func 関数で呼び出します:

call_user_func($this->callback);

一方、これはコールバックを期待する組み込み関数です。

于 2012-08-26T15:58:09.297 に答える