Немного выдумки, но если вам нужна более простая и менее ресурсоемкая альтернатива использованию 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
Это не мешает кому-то просматривать код и обходить его, однако с разумным сообщением в исключении вы сможете сообщить, как вы предполагали использовать классы.
Вы могли бы даже пойти дальше и реализовать что-то очень похожее на классы друзей C ++ , используя магические методы php __call()
и __callStatic()
, это означало бы, что вы могли бы выполнять секретную проверку, не загрязняя фактические методы. Недостатком этого является то, что вы не получите подсказку IDE для этих методов, потому что вам нужно будет добавить к ним префикс или что-то еще, иначе магические методы будут обойдены.