2019-03-26 14:20:24 1539次浏览 5条回答 0 悬赏 10 金钱
<?php
namespace app\common\widgets\right;
use yii\db\Query;
use yii\base\Widget;
use app\common\DataCache;

class TaskWidget extends Widget
{

    public $items = [];

    public function init()
    {
        //首页前十条的最新需求
        $task['top_new_task'] = DataCache::getHomeTask(1);
        $task['top_hot_task'] = DataCache::getHomeHotTask(1);
        $this->items = $task;
    }

    public function run()
    {

        $taskList = $this->items;

        //print_r($starList);die;
        return $this->render('task', [
            'task' => $taskList
        ]);
    }
}

最佳答案

  • 灰太狼 发布于 2019-03-27 11:21 举报

    在使用的时候 类命名空间::widget([这里是参数]) 这个没问题知道吧。

    然后 会调用基类的 widget(){
    这个方法里面会有一句$widget->run() ,为什么是#$widget->run(),不是$this->run()呢。
    }

    因为要执行调用者子类的run ,通过获取这个类给$config,然后创建了这个类的对象就可以调用run()了

    总结:也就是基类里封装好里必须调用run();子类必须要有这个方法(也不是子类必须如果子类要实现业务逻辑就要写这个run()),其实基类已经实现了一个空的run();你不写也行啊。那就什么都不做。

  • 回答于 2019-03-26 16:34 举报

    这是框架的一个神圣约定,为了简化Widget的调用过程的同时,作为Component的子类,缔造者们确保事件等相关机制和代码风格在Widget生命周期同样有效。

    当然,假如你自己来造一个框架,你可以决定没有这个Run方法,这不影响最终结果。

    或者,更复杂严谨但不神圣的——你可以用interface或者abstract来约束

    1 条回复
    回复于 2019-03-27 11:27 回复

    interface或者abstract来约束 也是针对基类的,但是yii很好的使用了一个空的run实现解决了约束问题。这种空的实现是yii的一种手段。太多地方使用这样的方式了。

    觉得很赞
  • 回答于 2019-03-26 17:23 举报

    楼上的高大上 我来个粗浅的 可以提高代码的复用性 避免重复代码

  • 回答于 2019-03-26 17:34 举报

    看一下yii\base\Widget源码,就知道为什么了

    1 条回复
    回复于 2019-03-26 17:55 回复

    我看了,还是不明白,水平不够

  • 回答于 2019-03-26 22:44 举报

    不用run的话,那你觉得应该怎么调用render?

您需要登录后才可以回答。登录 | 立即注册
PHP学院的中学生
副总裁

PHP学院的中学生

注册时间:2018-10-23
最后登录:2024-04-07
在线时长:168小时1分
  • 粉丝29
  • 金钱4730
  • 威望30
  • 积分6710

热门问题