Widget是Typecho组件中非常重要的一个组件,大部分组件都是从它继承而来,像Contents、Comments、Options、Users、Archive、Register、Menu、Login 等,继承关系图如下
私有静态变量对像池,单例模式,所用实例化的对象都放在这个数组中,有需要的时候通过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)