行为(Behavior)扩展以及插件(Plug or Hook)详解:

行为(Behavior)是ThinkPHP扩展机制中比较关键的一项扩展,行为即可以独立调用,也可以绑定到某个

标签中进行监听,官方提出的CBD模式中行为也占了主要的地位,可见行为在ThinkPHP框架中意义非凡。

这里指的行为是一个比较抽象的概念,你可以想象成在应用执行过程中的一个动作或者处理。在框架的执行流程中,

各个位置都可以有行为,例如路由检测是一个行为,静态缓存是一个行为,用户权限检查也是行为,

大到业务逻辑,小到浏览器检测,多语言检测等等都可以当做是一个行为,甚至说你希望你的网站

用户的第一次访问弹出Holle ,World!这些都可以当做一个行为,行为的存在让你无需改动框架和应用

,而在外围通过扩展或者配置来改变或者增加一些功能。而不同行为之间也具有位置共同性,比如,

有些行为的作用位置都是在应用执行前,有些行为都是在模板输出之后,我们把这些行为发生作用的位置

称之为标签(位),当应用程序运行到这个标签的时候,就会被拦截下来,统一执行相关的行为。

类似于AOP编程的“切面”的概念,给某一个切面绑定相关行为就成为了一种类AOP的思想。

___________________________________________________________________________________________________________________________

Aspect Oriented Programming(AOP)面相切面编程

AOP主要实现的目的是针对业务处理过程中的切面进行提取,它所面对的是处理过程中某个步骤,以获取逻辑过程中各部分之间低耦合性的隔离效果。比如我们最常见的就是日志记录了,举个例子,我们现在提供一个查询学生信息的服务,但是我们希望记录有谁进行了 这个查询。如果按照传统的OOP的实现的话,那我们实现了一个查询学生信息的服务接口(StudentInfoService)和其实现 类 (StudentInfoServiceImpl.java),同时为了要进行记录的话,那我们在实现类 (StudentInfoServiceImpl.java)中要添加其实现记录的过程。这样的话,假如我们要实现的服务有多个呢?那就要在每个实现的类 都添加这些记录过程。这样做的话就会有点繁琐,而且每个实现类都与记录服务日志的行为紧耦合,违反了面向对象的规则。那么怎样才能把记录服务的行为与业务 处理过程中分离出来呢?看起来好像就是查询学生的服务自己在进行,但却是背后日志记录对这些行为进行记录,并且查询学生的服务不知道存在这些记录过程,这 就是我们要讨论AOP的目的所在。AOP的编程,好像就是把我们在某个方面的功能提出来与一批对象进行隔离,这样与一批对象之间降低了耦合性,可以就某个 功能进行编程。

_________________________________________________________________________________________________________________

一、实例:(以下代码演示均基于 ThinkPHP3.2.2,未修改任何文件和目录结构),做一个ad(广告)的钩子

1.如果我们想在模板上调用例如{:tag('example',array('name'=>'name','value'=>
'value'))} 这样的方法,首先我们到 ThinkPHP->Common->functions.php,你会搜到 tag
这个方法,哈哈,我有强迫症,复制下 tag 方法,修改为

  1. function hook($hook,$params=array()){
  2. \Think\Hook::listen($hook,$params);        //监听一个钩子
  3. }
 

2.在控制器中 Application->Home->Controller->IndexController.class.php 添加如下代码:

  1. namespace Home\Controller;
  2. use Think\Controller;
  3. use Think\Hook;
  4. class IndexController extends Controller {
  5. public function index(){
  6. Hook::add('ad','Behavior\\adBehavior'); //我种下一颗子,终于长出了果实(摘抄《小苹果》歌词)
  7. $this->display();
  8. }
  9. }
 

3.来新建一个行为取名叫ad(广告),ThinkPHP->Library->Behavior->adBehavior.class.php

  1. namespace Behavior;
  2. class adBehavior{
  3. function run($arg){
  4. echo '我是一条'.$arg['name'].'广告,'.$arg['value'].'代言';        //在此介绍下,run必须的 ,细心的会在Think核心找到Behavior.class.php里面有这样一句操蛋的话  abstract public function run(&$params); 你懂的
  5. }
  6. }
 

3.在模板中使用 Application->Home->View->Index->index.html 添加如下代码:

  1. <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
  2. <html xmlns="http://www.w3.org/1999/xhtml">
  3. <head>
  4. <title>ThinkPHP3.2.2 行为(Behavior)扩展以及插件(Plug or Hook)详解(含实例)
  5. </title>
  6. <meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
  7. <meta name="description" content="Hook使用方法" />
  8. </head>
  9. <body>
  10. <h1>How to used?</h1>
  11. {:hook('ad', array('name'=>'AV','value'=>'*老师'))}
  12. </body>
  13. </html>

PHP 中的行为 ,与什么是切面的更多相关文章

  1. 如何优雅地在 Spring Boot 中使用自定义注解,AOP 切面统一打印出入参日志 | 修订版

    欢迎关注个人微信公众号: 小哈学Java, 文末分享阿里 P8 资深架构师吐血总结的 <Java 核心知识整理&面试.pdf>资源链接!! 个人网站: https://www.ex ...

  2. Spring Boot 中使用自定义注解,AOP 切面打印出入参日志及Dubbo链路追踪透传traceId

    一.使用背景 开发排查系统问题用得最多的手段就是查看系统日志,在分布式环境中一般使用 ELK 来统一收集日志,但是在并发大时使用日志定位问题还是比较麻烦,由于大量的其他用户/其他线程的日志也一起输出穿 ...

  3. .Net中的AOP系列之《单元测试切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 使用NUnit编写测试 编写和运行NUnit测试 切面的测试策略 Castle DynamicProxy测试 测试一个拦截器 注入依赖 ...

  4. .Net中的AOP系列之《方法执行前后——边界切面》

    返回<.Net中的AOP>系列学习总目录 本篇目录 边界切面 PostSharp方法边界 方法边界 VS 方法拦截 ASP.NET HttpModule边界 真实案例--检查是否为移动端用 ...

  5. 【原】Order属性决定了不同切面类中通知执行的先后顺序

    [障碍再现] MyBatis配置多数据源时,数据源切换失败. [原因分析]    自定义切面和Spring自带事务切面“即<aop:advisor>”执行的先后顺序导致数据源不能切换成功. ...

  6. Spring中的IOC\DI\AOP等概念的简单学习

    IoC(Inversion of Control,控制反转).这是spring的核心,贯穿始终, 所谓IoC,对于spring框架来说,就是由spring来负责控制对象的生命周期和对象间的关系.Spr ...

  7. 聊Javascript中的AOP编程

    Duck punch 我们先不谈AOP编程,先从duck punch编程谈起. 如果你去wikipedia中查找duck punch,你查阅到的应该是monkey patch这个词条.根据解释,Mon ...

  8. Spring AOP基于配置文件的面向方法的切面

    Spring AOP基于配置文件的面向方法的切面 Spring AOP根据执行的时间点可以分为around.before和after几种方式. around为方法前后均执行 before为方法前执行 ...

  9. Spring学习4-面向切面(AOP)之Spring接口方式

    一.初识AOP    关于AOP的学习可以参看帮助文档:spring-3.2.0.M2\docs\reference\html目录下index.html的相关章节       1.AOP:Aspect ...

  10. 面向切面编程AOP:基于注解的配置

    Aop编程就是面向编程的羝是切面,而切面是模块化横切关注点. -切面:横切关注点,被模块化的特殊对象. -通知:切面必须要完成的工作 -目标:被通知的对象 -代理:向目标对象应用通知之后创建的对象. ...

随机推荐

  1. spark操作geoip的domain数据库

    val ipv4 = sc.textFile("hdfs://hbase11:9000/sparkTsData/GeoIP2-Domain-Blocks-IPv4.csv").ma ...

  2. IP-Address TextBox

    http://www.codeproject.com/Articles/4693/IP-Address-TextBox 可以下载试用效果.个人感觉功能很强大,但输入时让人不太舒服.可以参考. ntro ...

  3. Unixbench测试工具和使用

    安装过程 wget http://soft.laozuo.org/scripts/UnixBench5.1.3.tgz tar xf UnixBench5.1.3.tgz cd UnixBench5. ...

  4. RGB to HSI, HSI to RGB Conversion Calculator

    The RGB color model is an additive system in which each color is defined by the amount of red, green ...

  5. 重载new操作符

    http://book.51cto.com/art/201202/317799.htm

  6. Effective Objective-C 2.0 — 第10条:在既有类中使用关联对象存放自定义数据

    可以通过“关联对象”机制来把两个对象连起来 定义关联对象时可指定内存管理语义,用以模仿定义属性时所采用的“拥有关系”与“非拥有关系” 只有在其他做法不可行时才应选用关联对象,因为这种做法通常会引入难于 ...

  7. CSS 改变文本选中颜色

    改变文字颜色 ::selection {    background: #f88;    text-shadow: none;    color: #000;}::-moz-selection {  ...

  8. C#实现Excel模板导出和从Excel导入数据

    午休时间写了一个Demo关于Excel导入导出的简单练习 1.窗体 2.引用office命名空间 添加引用-程序集-扩展-Microsoft.Office.Interop.Excel 3.封装的Exc ...

  9. Linux下的微秒级定时器: usleep, nanosleep, select, pselect

    Linux下的微秒级定时器: usleep, nanosleep, select, pselect 标签: linuxnulldelaystructdate 2012-02-07 23:29 4979 ...

  10. clang

    1.安装 clang 可以从官网下载,如果是CentOS 6 系统,也可以在 /etc/yum.repos.d/ 目录下增加一个 epel.repo 文件,内容如下: [epel] name=Extr ...