怎么做"静态"关键字有效? (一个代码示例)

时间:2016-01-27 05:32:01

标签: php static

当我尝试在C命名空间中创建Bglobal时,它确实正常运行。当我将B::create_unit()转换为C::create_unit() - >的正文时它变得破碎,不会起作用。任何人都可以提供一些有关这可能是什么的见解吗?

Class A {
  protected static $_instance;
  public $methods = array();

  public function __call($name, $args) {
    $obj = $this->methods[$name]['obj'];
    $method_name = $this->methods[$name]['method_name'];
    call_user_func_array(array($obj, $method_name), $args);
  }

  public static function add_method($name, $obj, $method_name) {
    $unit = static::get_unit();
    print_r($unit); // OMG, IT PRINTS (OBJECT B)!!!
    $unit->methods[$name]['obj'] = $obj;
    $unit->methods[$name]['method_name'] = $method_name;
  }

  public static function create_unit() {
    return static::$_instance = new static();
  }

  public static function get_unit() {
    return static::$_instance;
  }
}
Class B extends A {
  public static function create_unit() {
    return static::$_instance = new static();
  }
  public function log($msg) {
    echo $msg;
  }
}
Class C extends A {
  public static function create_unit() {
    $obj = static::$_instance = new static();
    $b = B::create_unit();
    C::add_method('foo', $b, 'log');
    $obj->foo('message');
    return $obj;
  }
}
C::create_unit();

1 个答案:

答案 0 :(得分:0)

self指的是实际编写new关键字的同一个类。

static,在PHP 5.3的后期静态绑定中,指的是您调用方法的层次结构中的任何类。

尝试使用self代替

self::get_unit();

Checkout self vs static