如果我正在使用PHP设计框架,并且在我的框架中有一个A类和一个AManager类。
我该怎么做才能让所有A对象方法或类方法只能在AManager方法中调用?
例如:
class A {
public function __construct() {
if( the calling environment is not within AManager Object Method )
throw new Exception("error")
else
init..
}
}
我尝试使用A的__callStatic
和debug_backtrace
,例如:
private static function create($a,$b) {
echo "in create";
new Logger($a,$b);
}
public function __callStatic($name, $arguments) {
$array = debug_backtrace(); // check environment
var_dump($array);
return;
call_user_func_array([Logger::class,$name],$arguments);
}
,但回溯仅显示__callStatic
。
那么有什么方法可以满足我的要求?
答案 0 :(得分:0)
使AManager
扩展A
,然后使您的A::__construct
得到保护。这意味着除扩展new A()
的类之外,没有人可以发起此类(意味着没有A
)。
然后AManager
中的工厂功能:
class AManager extends A {
protected static $instance;
public static function factory() {
if (empty(self::$instance)) {
self::$instance = new A();
}
return self::$instance;
}
}
答案 1 :(得分:0)
OH。那是我的错它与A上的[__callStatic,debug_backtrace,call_user_func_array]一起使用。
例如:
In [86]: for cate, lst in category_to_list.items():
...: print(cate)
...: for i in lst:
...: print('\t{}'.format(' '.join(i)))
...:
Science
Rubeena 18 Science
Kareen 18 Science
Art
Jullu 18 Art
sean 25 Art
Geology
Rene 18 Geology