PHP5: belli sınıflara işleve erişimi kısıtlamak

2 Cevap php

Sadece belli bir sınıf veya sınıfların ayarlanmış belirli bir işlevi çağırmak için izin PHP5'ta bir yolu var mı? Örneğin, ben üç sınıfları ("Foo", "Bar" ve "Baz"), benzer adlı yöntemleri ile hepsi var, ve ben Bar Foo::foo() aramak mümkün olabilir ama BAZ inkar etmek istiyorum diyelim bu çağrı yapmak için yeteneği:

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

Orada Foo, Bar ve Baz arasında mutlaka miras değil, yani protected veya benzeri nitelemeler kullanımı yardımcı olmaz; Bununla birlikte, yöntem (I örnek kolaylığı için çok buraya yapılan) mutlaka sabit değildir.

2 Cevap

Size, bu davranışı verebilir hiçbir dil özelliği yok, C + + arkadaş sınıfı gibi bir şey taklit etmek istiyor gibi geliyor?

Ancak, foo içinde () yöntemi debug_backtrace arayan kim olduğunu bulmak için kullanın ve onun istediğiniz istemiyorsanız eğer bir istisna olabilir!

Ben yararlı olabilir bu yapmak için bir fonksiyon oluşturmak ettik.

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." );
            }
        }
    }

}