PHP5:将对函数的访问限制为某些类
PHP5中是否有一种方法只允许某个类或一组类调用特定函数?例如,假设我有三个类(“Foo”、“Bar”和“Baz”),它们都具有类似的命名方法,我希望Bar能够调用PHP5:将对函数的访问限制为某些类,php,oop,access-modifiers,restriction,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 } c
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
或类似的修饰符不会有帮助;但是,这些方法并不一定是静态的(我在这里是为了简化示例)。 < P>没有语言特性可以给你这种行为,听起来你想模仿C++朋友类的东西?
但是,在foo()方法中,您可以使用它来找出调用方是谁,如果它不是您想要的,则抛出异常 我已经创建了一个函数来执行此操作,这可能会有所帮助
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." );
}
}
}
}
有点胡说八道,但是如果您想要一个更简单、内存占用更少的替代方法,而不是使用
debug\u backtrace()
,那么您可能需要该方法的附加参数,该参数必须具有特定的秘密值。例如:-
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的magic
\uuuu call()
和\uuuu callStatic()
方法实现与C++非常相似的东西,这意味着您可以在不污染实际方法的情况下进行秘密检查。这样做的缺点是你不会得到这些方法的IDE提示,因为你需要先对它们进行修改,否则魔法方法被绕过。不是C++的DEV,但是在读了(简短)关于朋友类之后,听起来就像我正在寻找的行为。令人沮丧的是,没有PHP等价物。