PHP5:限制对某些类的函数访问

时间:2010-06-03 14:20:03

标签: php oop access-modifiers restriction

PHP5中是否只允许某个类或一组类调用特定函数?例如,假设我有三个类(“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或类似修饰符的使用无济于事;但是,这些方法不一定是静态的(为了简化示例,我在这里做了它们。)

3 个答案:

答案 0 :(得分:7)

没有语言功能可以为您提供这种行为,听起来您想模仿像C ++朋友类这样的东西?

但是,在foo()方法中,您可以使用debug_backtrace来查找调用者是谁,如果不想要,则抛出异常!

答案 1 :(得分: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." );
            }
        }
    }

}

答案 2 :(得分:2)

有点软糖,但是如果你想要一个更简单的内存密集型替代方法来使用debug_backtrace(),你可能需要一个额外的参数,该方法必须是某些特定的 secret 价值。例如: -

class Foo {
    static function foo($arg='') {
        if ($arg != 'act6hd56') {
            throw new Exception('Cannot call this method from any class except Bar');
        }
        print "foo";
    }
}

class Bar {
    static function bar() { Foo::foo('act6hd56'); print "bar"; } // Works
}

Foo::foo(); // Throws exception

这并不能阻止某人查看代码并解决它,但是如果在异常情况下使用合理的消息,您应该能够传达您打算如何使用这些类。

你甚至可以使用php的魔术__call()__callStatic()方法进一步实现与C ++的friend classes非常相似的东西,这意味着你可以在不污染实际方法的情况下进行秘密检查。这样做的缺点是你不会得到这些方法的IDE提示,因为你需要为它们添加前缀或其他东西,否则会绕过魔术方法。