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
或类似修饰符的使用无济于事;但是,这些方法不一定是静态的(为了简化示例,我在这里做了它们。)
答案 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提示,因为你需要为它们添加前缀或其他东西,否则会绕过魔术方法。