学习yii2.0——行为
学习yii框架的行为之前,需要先了解yii的事件,可以参考这篇博客:
怎么理解行为
yii框架的行为有点类似于trait,可以有个大体的概念:
1、有一个类A,包含一些属性和方法,很普通的一个类A。
2、现在需要在这个简单的类中使用类B和类C中的某些属性和方法,或者这两个类中为指定事件绑定的事件处理程序。
有一种方法可以实现:可以使用组合的方式,在这个简单的类A中,创建其他类(B、C)的对象,然后进行其他的操作,比如访问他们的成员属性和方法。
yii框架中行为的功能:
1、在类B和类C声明为行为类,可以在这个行为类中定义属性和方法,以及某些事件对应的事件处理程序。
2、在类A中的behavior方法中,将前面的两个行为类B、C包含进来,那么就可已使用B、C中的行为和方法了。
注意这里并没有把B、C实例化,而是直接使用B、C类中的方法和属性。
<?php
namespace app\controllers; use yii\web\Controller;
use yii\base\Behavior; class Demo {
public function Show()
{
echo "this is demo<br>";
}
} //自定义的行为类要继承yii\base\Behavior类
class MyHavior1 extends Behavior
{
public $prop = "hello world 1 <br>"; //自定义的方法
public function test()
{
echo "this is MyHavior 1 /tetst<br>";
} public function events()
{
//指定事件
return [
"cry" => function() {echo "don't cry 1<br>";},
"test" => [new \app\controllers\Demo(), "Show"]
];
}
} //自定义的行为类要继承yii\base\Behavior类
class MyHavior2 extends Behavior
{
public $prop = "hello world 2 <br>"; //自定义的方法
public function test()
{
echo "this is MyHavior 2 /tetst<br>";
} public function events()
{
//指定事件
return [
"cry" => function() {echo "don't cry 2<br>";},
"test" => [new \app\controllers\Demo(), "Show"]
];
}
} class HelloController extends Controller
{
public function behaviors()
{
return [
//返回附加行为,默认是都添加
//加载两个行为类,demo和example类似于标签,这里的顺序是有意义的
"demo" => MyHavior1::className(),
"example" => MyHavior2::className()
];
} public function actionIndex()
{
//当两个行为behavior有相同的行为的时候,默认以behaviors中先出现优先级高
echo $this->prop; // hello world 1
$this->test(); //this is MyHavior/tetst 1
$this->trigger("cry"); //don't cry 1 don't cry 2 //手动从前面behaviors()中选择附加行为
$behaviors = $this->getBehavior("example");
echo $behaviors->prop; // hello world 2
$behaviors->test(); // this is MyHavior 2 /tetst
$this->trigger("test"); // this is demo this is demo echo "aaa";
//手动删除附加的行为,现在只有example有意义了
$this->detachBehavior("demo");
echo $this->prop; // hello world 2
$this->test(); //this is MyHavior/tetst 2
$this->trigger("cry"); //don't cry 1 don't cry 2 //从上面的例子中可以看出,事件一旦触发,那么虽然有先后顺序,但是都会执行事件处理程序
//但是访问属性和方法时,如果有重复时,默认是第一个为准
}
}
学习yii2.0——行为的更多相关文章
- 学习yii2.0——基础入门
声明:本文内容来自于yiichina.com的权威指南. 安装 推荐使用composer来安全,可能有点慢(要下载的依赖比较多). composer create-project --prefer-d ...
- 学习yii2.0——事件
参考:https://www.yiichina.com/doc/guide/2.0/concept-events 事件 yii框架中的事件定义和JavaScript中的事件定义差不多:为某个事件绑定一 ...
- 学习 yii2.0——视图之间相互包含
布局 首先创建一个布局文件simple.php,路径是在views/layout/目录下. <p>this is header</p> <?= $content ?> ...
- YII2.0--------这篇文章记录我学习YII2.0的过程吧,也可以让更多的人少走弯路
1.情况:今天我从github上下载了一个项目,本以为直接丢到根目录运行就行了,但是不行. 解决办法:首先安装git,安装步骤这里不讲了,稍微讲一下配置环境变量.
- 学习yii2.0——依赖注入
依赖注入 依赖注入是一种设计模式,可以搜索“php依赖注入”,这里不阐述了. yii框架的依赖注入 Yii 通过 yii\di\Container 类提供 DI 容器特性. 它支持如下几种类型的依赖注 ...
- yii2.0发送qq邮件详情配置
首先要想使用qq发送邮件必须打开使用的qq邮箱里的一个配置,
- Yii2.0 高级版安装 windows
最近在学习yii2.0 在安装高级版的时候遇到一些问题 索性解决了 下面分享一下 一.关于下载 自行百度,在Yii Framework 中文社区 下载专区下载高级应用程序模板(这边下载用电信网络不用下 ...
- Elasticsearch5.3 学习(一):安装、Yii2.0 下载es扩展
Elasticsearch是一个基于Lucene,提供了一个分布式多用户能力的全文搜索引擎.其他就不多说了,官方文档有详细的介绍. 我自己是在CentOS 7.0安装的 Elasticsearch 是 ...
- yii2.0的学习之旅(二)
前言:上一次我们简单认识了一下yii2.0安装,模型基本(增,删,改,查)操作 一.前后台数据交互 *如果你觉得默认的top样式太丑,可以这样关掉* *底部也可以这样关掉* (1)mvc合作操作数据 ...
随机推荐
- 监控MySQL或Web服务是否正常
在工作中,我们往往利用脚本定时监控本地.远端数据库服务端或Web服务是否运行正常,例如:负载高.cup高.连接数满了等.... 方法一:根据端口 本地:netstat/ss/lsof ① nets ...
- June 10. 2018, Week 24th, Sunday
There is no friend as loyal as a book. 好书如挚友,情谊永不渝. From Ernest Miller Hemingway. Books are my frien ...
- 025k个一组翻转链表
#include "000库函数.h" struct ListNode { int val; ListNode *next; ListNode(int x) : val(x), n ...
- ORM版学员管理系统2
学生信息管理 展示学生信息 URL部分 url(r'^student_list/', app01_views.student_list, name="student_list"), ...
- java中的闭包
闭包(Closure)是一种能被调用的对象,它保存了创建它的作用域的信息 public class Programmer { private String name; public Programme ...
- springBoot 搭建web项目(前后端分离,附项目源代码地址)
springBoot 搭建web项目(前后端分离,附项目源代码地址) 概述 该项目包含springBoot-example-ui 和 springBoot-example,分别为前端与后端,前后端 ...
- 2、原生jdbc的dao模式
一.dao模式 (data access object)1.作用:持久层,专门操作数据的层次结构,不掺杂任何的业务和其他内容2.dao组成部分: a.数据库工厂类 b.数据实体类 javabean p ...
- sqlachemy 获取新创建对象的id,flush与commit
for account_info in valid_account_detail: try: account = account_info.get('account') password = acco ...
- openjdk8源码编译
1. 安装源码管理工具 yum install mercurial 2. 下载源码 hg clone http://hg.openjdk.java.net/jdk8u/jdk8u jdk8u #执行源 ...
- LNMP环境
准备工作:1)把所有的软件安装在/usr/local/,源码包放在/package/,数据:自定义,日志文件:自定义 创建www所属组及用户/usr/sbin/groupadd www/usr/sbi ...