Jeen

Jeen

难得糊涂

  • 财富值1075
  • 威望值180
  • 总积分3025

个人信息

  • 回复了 的回答

    首先解答一个疑问,不是“父类调用了子类的方法”,而是“子类继承了父类的方法,供这个子类的实例对象调用”。

    至于你提到的两种写法,怎么说呢, 原则上讲类的封装就是为了方便复用,所以写法一和写法二,本身都是对的。

    只是假如 Parent 类有另外一个子类(SubClass)也需要say方法,且say方法的逻辑流程与你给的流程完全一致时,那SubClass是否也需要实现一次say方法?

    通常答案是“no”,say方法从Parent类继承,我们只需要 在SubClass中实现它特定的dosomething 即可与 children 类进行区分。
    如果有特定情况,我们也可以在 SubClass 中重写 say 方法,实现其他特殊需求。

    额,说的比较模糊。欣赏你观察和思考问题的方式,但至于实际代码怎么写,见仁见智吧

    关于父类子类,同我之前说的,抽象方法可在子类中“实现”,具体方法可在子类中“重写”,当然不管是实现还是重写,实例化这个子类后,调用这个方法,执行的都是子类中的代码逻辑。另外,后面补充的,行为注入是框架提供的另外一种复用类方法的途径,跟父子类继承没有什么关系。 说的有点儿绕,不太明白你目前的疑问具体是什么。

    建议回到基础的关系上来看问题, 父类 子类 实例对象。通常类只提供属性和方法的定义以及继承,实际的调用是“实例对象”进行操作的,所以调用的具体流程还得看这个对象 实例化的是哪个类。

    其实我个人是不太建议在这些原理定义或者专业术语上花费太多时间的,大部分实际业务的实现,只需要知道相关的用法即可。
    当然摸清楚底层原理,对提升整体的理解力大有帮助,学其他东西也跟容易触类旁通。

  • 仔细读几遍报错信息吧
    或者
    把 SiteController 文件的 前20行代码帖出来看看
    包含 <?php ...

  • 首先解答一个疑问,不是“父类调用了子类的方法”,而是“子类继承了父类的方法,供这个子类的实例对象调用”。

    至于你提到的两种写法,怎么说呢, 原则上讲类的封装就是为了方便复用,所以写法一和写法二,本身都是对的。

    只是假如 Parent 类有另外一个子类(SubClass)也需要say方法,且say方法的逻辑流程与你给的流程完全一致时,那SubClass是否也需要实现一次say方法?

    通常答案是“no”,say方法从Parent类继承,我们只需要 在SubClass中实现它特定的dosomething 即可与 children 类进行区分。
    如果有特定情况,我们也可以在 SubClass 中重写 say 方法,实现其他特殊需求。

    额,说的比较模糊。欣赏你观察和思考问题的方式,但至于实际代码怎么写,见仁见智吧

  • 发布了教程
    Url Rules 使用指南
  • 发布了教程
    GridView添加关联属性或自定义列
  • 可以使用 ArrayDataProvider 建议看下源码

    样例代码如下

    
        public function actionIndex()
        {
            $dataProvider = new ArrayDataProvider();
            $dataProvider->setModels([
                ['id'=>1,'name'=>'john'],
                ['id'=>2,'name'=>'tom'],
            ]);
            return $this->render('index',[
                'dataProvider' => $dataProvider,
            ]);
        }
        
    

    数组的键名即对应 数据表的字段名。 试试看吧 :)

  • 视图源码呢? 贴出来看看

    猜测应该是你的视图文件不完整,不管你是否需要layout模版。
    使用框架渲染视图,需要符合一定的规范如

    <?php $this->beginPage() ?>
    <!DOCTYPE html>
    <html lang="<?= Yii::$app->language ?>">
    <head>
    <meta charset="<?= Yii::$app->charset ?>">
    <title><?= Html::encode($this->title) ?></title>
    <?php $this->head() ?>
    </head>
    <body>
    <?php $this->beginBody() ?>
    
    <?= $content;//不需要模版时, 替换为 具体视图的代码 ?>
    
    <?php $this->endBody() ?>
    </body>
    </html>
    <?php $this->endPage() ?>
    

    有兴趣研究源码的话,推荐看看 $this->head() 部分的源码

  • 可以参考下这个

    https://github.com/org-yii-china/yii2-avatar 
    

    跟这个站的操作样式不完全一样,不过用的 是同一个 js 组件 cropper.js

  • 两种方式

    //方法1  直接给模型赋初值
    if ($model->getIsNewRecord()) {
        $model->type = 3;
    }
    echo $form->field($model,'type')->dropDownList([1=>'111',2=>'222',3=>'333']);
    
    //方法2  同楼上
    echo $form->field($model,'type')->dropDownList([1=>'111',2=>'222',3=>'333'],['prompt' => 3,]);
    
  • 测试模型 User

    //...
        public function getCount()
        {
            return $this->hasOne(UserCount::class, ['user_id' => 'id']);
        }
    
        public function getSetting()
        {
            return $this->hasMany(UserSetting::class, ['user_id' => 'id']);
        }
    //...
    

    测试代码

    echo User::find()
                ->joinWith('count as a')
                ->joinWith('setting as b')
                ->createCommand()
                ->getRawSql();
    
    

    输出sql

    
    SELECT `user`.* FROM `user` LEFT JOIN `user_count` `a` ON `user`.id = a.user_id LEFT JOIN `user_setting` `b` ON `user`.id = b.user_id
    
    

    仅供参考 :)

总监 等级规则
3025/5000
资料完整度
50/100
用户活跃度
0/100

Ta的关注

0

Ta的粉丝

9

Ta的访客

38