Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/oop/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP5:将对函数的访问限制为某些类_Php_Oop_Access Modifiers_Restriction - Fatal编程技术网

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

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

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
或类似的修饰符不会有帮助;但是,这些方法并不一定是静态的(我在这里是为了简化示例)。

< 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等价物。