Typecho组件抽象基类Widget

Admin
2022-07-13 / 0 评论 / 111 阅读 / 正在检测是否收录...

  Widget是Typecho组件中非常重要的一个组件,大部分组件都是从它继承而来,像Contents、Comments、Options、Users、Archive、Register、Menu、Login 等,继承关系图如下
QQ图片20220713144150.png

私有静态变量对像池,单例模式,所用实例化的对象都放在这个数组中,有需要的时候通过key从里面直接取
private static $widgetPool = [];

数据堆栈,其实是一个二维数组,里面存放多行记录,一行记录又是一个数组。
protected $stack = [];
数据行,一行记录
protected $row = [];

// 构造函数

public function __construct(WidgetRequest $request, WidgetResponse $response, $params = null)
{

// 设置函数内部对象
$this->request = $request;
$this->response = $response;
$this->parameter = Config::factory($params);
$this->init();

}

// 工厂方法,将类静态化放置到列表中 返回一个widget
public static function widget(string $alias,$params = null,$request = null,$disableSandboxOrCallback = true): Widget
{

[$className] = explode('@', $alias);
$key = Common::nativeClassName($alias);

.....
// 检查对像池中是否有它 有就直接返回,没有则创建 然后执行 最后再放到对像池中
if (!isset(self::$widgetPool[$key])) {
    ......
    try {
        $widget = new $className($requestObject, $responseObject, $params);
        $widget->execute();
        ......
    } catch (Terminal $e) {
        ......
    } finally {
    ......
    }
    self::$widgetPool[$key] = $widget;
}
return self::$widgetPool[$key];

}

// 生成对像实例
public static function alloc($params = null, $request = null, $disableSandboxOrCallback = true): Widget
{

return self::widget(static::class, $params, $request, $disableSandboxOrCallback);

}

// 事件触发 条件成立返回自已 方便调用其它方法
public function on(bool $condition)
{

if ($condition) {
    return $this;
} else {
    return new EmptyClass();
}

}

// 将类本身赋值 引用传递 这样写在前端和html混写非常方便
public function to(&$variable): Widget
{

return $variable = $this;

}

// 获取对象插件句柄
public static function pluginHandle(): Plugin
{

return Plugin::factory(static::class);

}

发现没有,获取对像句柄 和 生成对像实例 中传递参数都用到了static::class 为什么没有self::class?他们之间有什么区别?
static 代表的永远是指向调用类。也就是说虽然在 Widget类中但它指向的是调用类 。举一个简单的例子
class A {
  public static function who() {

    echo __CLASS__ ;

  }
  public static function test() {

    self::who();
    static::who();// 后期静态绑定从这里开始

  }
}

class B extends A {
  public static function who() {

    echo   __CLASS__ ;

  }
}

B::test();// 输出AB 也就是说在A的静态方法中,self指的是自已A类, static指向的调用者是B类。

0

评论 (0)

取消