1

クラスメソッドから関数を作成することは可能ですか?

すなわち。

class Test {

    public function __construct()
    {
        if ( ! function_exists('foo') ) {
            function foo ()
            {
                 return $this->foo();
            }
        }
    }

    private function foo()
    {
        return 'bar';
    }

}

または、逆に関数を作成してメソッド内で使用する必要がありますか?

4

3 に答える 3

0

そのようにするだけで、phpはそれを行うことができます

class Test {

    public function __construct()
    {
        if ( ! function_exists('foo') ) {
            function foo ()
            {
                 return $this->foo();
            }
        }
    }

    private function foo()
    {
        outsidefunction();
        return 'bar';
    }

}

private function outsidefunction()
{
   return 0;
}
于 2012-06-15T09:48:21.373 に答える
0

クラスメソッドのコピーであるグローバル関数を作成しようとしています。私は関数が単なる変数であり、それらを簡単にコピーできるjavascriptの土地から来ました...

PHPの関数は第一級市民ではないため、PHPの変数のように関数をコピーすることはできません。関数へ参照を渡すことはできますが、関数自体を渡すことはできません。

于 2012-06-15T10:25:00.847 に答える
0

理論的には、Reflectionを使用してクロージャを取得し、を介してそれを参照してから、クロージャを呼び出す$GLOBALS関数を定義できます。foo$GLOBALS

<?php // requires 5.4
class Test {

    public function __construct()
    {
        if (!function_exists('foo')) {
            $reflector = new ReflectionMethod(__CLASS__, 'foo');
            $GLOBALS['foo'] = $reflector->getClosure($this);
            function foo() {
                return call_user_func($GLOBALS['foo']);
            }
        }
    }

    private function foo()
    {
        return 'bar';
    }
}

$test = new Test();
echo foo();

デモを実行する

しかし、それは非常に醜いので、このようにしたくはありません。

より多くのJavaScriptのようなオブジェクトが必要な場合は、

しかし、それでも、そこに提案されているテクニックでさえ、応急修理のimoがあります。

于 2012-06-15T10:30:26.157 に答える