5

特定のクラスまたはクラスのセットのみが特定の関数を呼び出すことを PHP5 に許可する方法はありますか? たとえば、3 つのクラス (「Foo」、「Bar」、および「Baz」) があり、すべて同様の名前のメソッドがあり、Bar が呼び出しできるようにしたいFoo::foo()が、Baz がその呼び出しを行う機能を拒否するとします。

class Foo {
    static function foo() { print "foo"; }
}

class Bar {
    static function bar() { Foo::foo(); print "bar"; } // Should work
}

class Baz {
    static function baz() { Foo::foo; print "baz"; } // Should fail
}

Foo::foo(); // Should also fail

Foo、Bar、および Baz の間に必ずしも継承があるとは限らないため、protectedまたは同様の修飾子を使用しても役に立ちません。ただし、メソッドは必ずしも静的ではありません (例を簡単にするために、ここではそのようにしています)。

4

3 に答える 3

8

その動作を可能にする言語機能はありません。C++ フレンド クラスのようなものをエミュレートしたいようですね。

ただし、foo() メソッド内では、debug_backtraceを使用して発信者が誰であるかを確認し、必要でない場合は例外をスローすることができます。

于 2010-06-03T14:22:45.017 に答える
3

これを行うための便利な関数を作成しました。

class HelperClass
{

    static function callOnlyByClass( $class_name, $function_name = NULL )
    {
        $backtrace = debug_backtrace( DEBUG_BACKTRACE_IGNORE_ARGS );
        $caller_class = $backtrace[2]["class"];
        if( $caller_class !== $class_name ) {
            throw new Exception( "Only $class_name is allowed to call this function. Was called by $caller_class." );
        }
        if( ! is_null( $function_name ) ) {
            $caller_function = $backtrace[2]["function"];
            if( $caller_function !== $function_name ) {
                throw new Exception( "Only $class_name::$function_name is allowed to call this function. Was called by $caller_class::$caller_function." );
            }
        }
    }

}
于 2011-09-02T19:22:01.373 に答える