Yii 学习笔记

关于写代码的顺序

在学习使用表单的章节中,作者先写Model的代码,然后写controller的代码,最后写View的代码。这不是一个偶然,在使用thinkPHP框架写代码的时候,也同样遇到过类似的问题,开始写代码的时候不知道从那里入手比较顺。实际上,如果模型没有定义好,证明整个业务逻辑没有理清,没有理清业务当然就构建不出模型来,所以教程里面的顺序安排也给了自己指导意见,将来的代码逻辑里面应该从模型开始,快速搭建代码框架,跑通业务流程,然后细化细节。

Yii框架处请求的逻辑

Yii 学习笔记_第1张图片

小知识点

1、yii\base\Model 被用于普通模型类的父类并与数据表无关。yii\db\ActiveRecord 通常是普通模型类的父类但与数据表有关联

2、表达式 Yii::$app 代表应用实例,它是一个全局可访问的单例。同时它也是一个服务定位器,能提供 request,response,db 等等特定功能的组件。

3、当一个操作中调用了 yii\web\Controller::render() 方法时,它将会按 views/控制器 ID/视图名.php 路径加载 PHP 文件。主要的两个目录是:controllers和views,对应关系是一个controller对应views的一个目录,对应规则是”控制器 ID“。
Yii中处理控制器ID和操作 ID是一样的规则, 总是被以小写处理,如果一个ID 由多个单词组成,单词之间将由连字符连接(如 create-comment)。ID 映射为控制器名或者方法名时移除了连字符,将每个单词首字母大写,并加上 action 前缀。 例子:操作 ID create-comment 相当于方法名 actionCreateComment。

关键知识点

  • 属性(Property)
    成员变量是就类的结构构成而言的概念,而属性是就类的功能逻辑而言的概念,两者紧密联系又相互区别。
    成员变量和属性的区别与联系在于:
    1)成员变量是一个“内”概念,反映的是类的结构构成。属性是一个“外”概念,反映的是类的逻辑意义。
    2)成员变量没有读写权限控制,而属性可以指定为只读或只写,或可读可写。
    成员变量不对读出作任何后处理,不对写入作任何预处理,而属性则可以。
    3)public成员变量可以视为一个可读可写、没有任何预处理或后处理的属性。 而private成员变量由于外部不可见,与属性“外”的特性不相符,所以不能视为属性。
    4)虽然大多数情况下,属性会由某个或某些成员变量来表示,但属性与成员变量没有必然的对应关系。
    为什么yii里面着重描述了属性这个概念呢?个人理解是,在yii里面,在面向对象的编程思想的指导下,非常有必要让开发人员对变量封装有足够的重视,所以花了特别的章节来描述属性这个概念。
    如何定义属性?:
    1)继承自 yii\base\Object 。
    2)声明一个用于保存该属性的私有成员变量。
    3)提供getter或setter函数,或两者都提供,用于访问、修改上面提到的私有成员变量。 如果只提供了getter,那么该属性为只读属性,只提供了setter,则为只写。
    如果没有属性的这个概念,将会怎么样?
    没有yii里面的这种属性概念,其实php5之后也是有提供魔法方法__set()和__get(),这两个方法的出现是因为面向对象里面,属性采用封装的方式定义,这两个方法不是默认存在的,而是我们手工添加到类里面去的,像构造方法(__construct())一样,类里面添加了才会存在。yii在yii\base\Object里面对这两个函数进行实现,其中最核心的代码就是判断有没有编写set和get函数,如果没有则抛出异常。通过这样的代码逻辑,yii把私有变量封装起来,成为严格意义的属性。

  • 事件(Event)
    事件既是代码解耦的一种方式,也是设计业务流程的一种模式。使用事件,可以在特定的时点,触发执行预先设定的一段代码。
    如果没有事件这个功能,类似功能怎么做?
    如果没有事件的处理机制,每次遇到某个特定场景或者特定值得时候,就需要执行某段固定的代码,这段代码如果只被一个地方使用,那没有事件机制也没什么不妥,如果这个代码被很多地方使用,就需要把代码抽取出来成为独立的函数,方便被多个地方调用。如果只调用这个函数自己就也还好,如果调用多个函数,就得写多行调用代码,行数足够多之后很自然就会想办法把函数都封装都一个统一的函数里面进行管理。这样的代码逻辑再往上抽象和优化组织就会成为事件这种机制。
    怎么写代码?
    1)得定义一些事件名
    2)给事件名指定处理函数
    3)触发对应事件

  • 行为(Behavior)
    使用行为(behavior)可以在不修改现有类的情况下,对类的功能进行扩充。 通过将行为绑定到一个类,可以使类具有行为本身所定义的属性和方法,就好像类本来就有这些属性和方法一样。 而且不需要写一个新的类去继承或包含现有类。
    关于属性的注入是通过set和get函数实现的,而行数的注入式通过__call()函数实现的。
    要理解行为与继承和特性(Traits) 的区别。行为的一些使用场景因为内容太多,先放一放先。

  • -

你可能感兴趣的:(yii)