5
<?php
$ar = (object) array('a'=>function(){
   echo 'TEST';
});
$ar->a();
?>

このエラーが発生します未定義のメソッドの呼び出し

4

5 に答える 5

3

アップデート:

PHP 5.3以降を使用している場合は、他の回答をご覧ください:)


私はそれが正しい構文だとは思いません、それはあなたに与えるでしょう:

Parse error: syntax error, unexpected T_FUNCTION in....

クラスを作成し、それにメソッドを追加し、newキーワードを使用してインスタンス化する必要があります。そうすれば、次のことができるようになります。

$ar->a();

class myclass
{
    public function a()
    {
        echo 'TEST';
    }
}

$ar = new myclass;
$ar->a(); // TEST

詳細については、クラスとオブジェクトを参照してください。

于 2012-04-10T09:51:11.153 に答える
2

匿名であるかどうかにかかわらず、コールバック関数があるため、そのように処理する必要があります。例えば:

<?php

$ar = (object) array(
    'a' => function(){
        echo 'TEST';
    }
);

call_user_func($ar->a);

?>
于 2012-04-10T09:57:57.393 に答える
2

何らかの理由で、あなたのようにクロージャを実行することはおそらくないようです。コードを変更して別の変数を関数に設定すると、次のように呼び出すことができます。

$ar = (object) array('a'=>function(){
   echo 'TEST';
});
$a = $ar->a;
$a();

これは解決策ではありません。しかし、私が見ることができることから、これはPHP5.3のバグまたは制限のようです。

これを試すときは5.3.5を使用しています。

于 2012-04-10T09:59:52.377 に答える
0

関数a()はプロパティa以外にないので、で呼び出す必要があります$ar->a
とにかく、私はそれがあなたがそれを期待するように働くだろうとは思わない。

編集: ÁlvaroG。Vicarioが提案したように、関数を呼び出さないでcall_user_funcechoを使用する必要があります。そうすれば、正しく機能します。

于 2012-04-10T09:53:52.520 に答える
0

または、それを楽しむために、次のようなことを行うことができます-

<?php
$ar = new stdClass;
$ar->a = function($to_echo){ echo $to_echo; };
$temp = $ar->a;

//[Edit] - $ar->a("hello"); // doesn't work! php tries to match an instance method called     "func" that is not defined in the original class' signature
$temp("Hey there");
call_user_func($ar->a("You still there?"));
?>
于 2012-04-10T09:57:39.930 に答える