如何设置PHP类的可见性

时间:2018-07-20 08:02:39

标签: php

如果我正在使用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的__callStaticdebug_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

那么有什么方法可以满足我的要求?

2 个答案:

答案 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