6

静的関数を変数に割り当てて、パラメーターとして送信できるようにします。例えば:

class Foo{
    private static function privateStaticFunction($arg1,$arg2){
      //compute stuff on the args          
    }

    public static function publicStaticFunction($foo,$bar){

         //works
         $var = function(){
                   //do stuff
                };

         //also works
         $var = function($someArg,$someArg2){
                   //do stuff
         };

         //Fatal error: Undefined class constant 'privateStaticFunction'                    
         $var = self::privateStaticMethod;

         //same error
         $var = Foo::privateStaticFunction;

         //compiles, but errors when I try to run $var() somewhere else, as expected
         //Fatal error: Call to private method Foo::privateStaticMethod() from context ''
         $var = function(){
             return Foo::privateStaticMethod(); 
         }; 
    }
}

さらにいくつかのバリエーションを試しましたが、どれも機能しませんでした。

この種の機能的なハッキングがPHPで機能することすら期待していませんが、ねえ、誰が知っていますか?

PHPでそれを行うことは可能ですか、それとも使用してハックを考え出す必要がありevalますか?

PS:## phpのLawnGnomeは、私が使いたいことを実行できることについて何か言及しましたarray('Foo','privateStaticMethod')が、彼が何を意味するのか理解できず、彼が忙しそうに見えたので、私は彼にそれ以上圧力をかけませんでした。

4

3 に答える 3

4

配列引数とともにcall_user_funcを使用したいとします。

$var = array('Foo','privateStaticMethod');
call_user_func($var);

Fooそのメソッドの「private」指定子は、クラス内でこの方法でのみ呼び出すことができることに注意してください。

call_user_funcは、最初の引数としてcallableを取ります。PHP 5.2.3以降、この場合は配列表記を回避できることに注意してください。

静的クラスメソッドは、インデックス0のオブジェクトの代わりにクラス名を渡すことにより、そのクラスのオブジェクトをインスタンス化せずに渡すこともできます。PHP5.2.3以降、「ClassName::methodName」を渡すこともできます。

于 2012-09-26T03:35:45.587 に答える
3

注意として、静的変数を次のように設定する必要があります。

static $privateStaticMethod;

$var = self::$privateStaticMethod;

when $usingself::を省略すると、変数ではなくクラス CONSTANT にアクセスしようとします。

実際には、この行は次のようになることを意味していたと思います。

//Fatal error: Undefined class constant 'privateStaticFunction'                    
$var = self::privateStaticFunction("arga", "argb");

PHP 5.4 を使用している場合は、 内で次の操作を実行できますpublicStaticFunction

$var = function(){
    return self::privateStaticFunction(); 
}; 

$var();

PHP 5.4 では、PHP を使用class scopeしてラムダ関数からアクセスできます。

また、調べましたReflectionClassか?

call_user_func_array()以下は、より OOP スタイルで置き換えるために使用されます。

<?php
$rc = new ReflectionClass('SomeClass');
$class = $rc->newInstanceArgs(array('foo', 'bar'));

echo $class->doSomething();

独自のクラスを記述して、ReflectionMethodどの実装ReflectionClassを使用setAccessible()し、保護されたプライベート メソッドへのアクセスを許可することができます。

于 2012-09-26T03:47:50.287 に答える