AOP是OOP的延续,是Aspect Oriented Programming的缩写,意思是面向方面编程,有的又称之为面向切面编程。在企业级开发中面向方面编程很有用。比如,我们在调用某些特定的方法之前,我们需要作一个日志记录,调用方法之后,我们还需要一个日志记录。我们先来看看不使用AOP,我们在PHP里怎么实现。

<?php
/**
* 日志类
*/
class SystemLog {
function beforeLog() {
// write before log
} function afterLog() {
// write after log
}
} /**
* 新闻类
*/
class News extends SystemLog {
function add() {
$this->beforeLog();
// add news
$this->afterLog();
} function delete() {
// delete news
}
}

我们定义一个日志类,类里包含两个方法beforeLog()和afterLog(),用于记录方法调用前和调用后的日志,接着我们定义了新闻类,新闻类继承日志类,要在调用add()方法前后完成日志记录,我们只有在add()方法内部调用beforeLog()和afterLog()两个方法。虽然我们实现在调用add()方法前/后记录日志,但是这样的代码在OOP编程中一点儿也不优雅,也违背了“弱耦合,强内聚”的思想,因为News类下的add()方法就只是应该做添加新闻这一件事情,然后我们在add()方法中又记了日志,另外如果我们需要为很多方法增加日志记录功能,那么将会调用很多次beforeLog()和afterLog()方法,带来很多重复代码。

在PHP5中,如果调用未定义的方法,将自动调用_call()方法。利用PHP5的这个特点,我们可以在_call()方法中实现AOP编程,这种AOP编程只是一个AOP雏形,没有Java那样强大。

<?php
/**
* 日志类
*/
class SystemLog {
function _call($method,$args) {
$method = "_$method"; // 在要调用的方法名前加‘_’,$method为要调用的方法名
// write before log
$return = call_user_func_array(array($this, $method), $args);
// write after log
return $return;
}
} /**
* 新闻类
*/
class News extends SystemLog {
function _add() {
// add news
} function delete() {
// delete news
}
}

新闻类还是继承日志类,需要注意的是我们在add()方法前加了‘_’,add()方法中并没有任何日志记录相关的代码。

$news = new News();
$news->add();

调用News类中的add()方法,注意重写后的News类中并没有add()方法,只有_add()方法,这时PHP找不到add()方法则会自动调用_call()方法,_call()方法有两个参数,第一个参数为被调用方法的名称,第二个参数为被调用方法的参数,在_call()方法中首先为被调用的方法名前添加‘_’,这里,添加‘_’后的方法后就变成了_add,_add()方法在News类中是存在的,然后写方法调用前日志,接着使用call_user_func_array()函数执行前对象方法调用,方法调用完成再写方法调用后日志。

回顾一下,我们利用编程惯例和PHP5中调用未定义的方法将自动调用_call()方法的特性,实现了AOP,但这里的AOP还只是雏形,功能还不够强大,随着PHP的发展,我相信未来的PHP在AOP方面也会更加强大。

相关:https://www.cnblogs.com/fps2tao/p/9263195.html

转:https://blog.csdn.net/clj9017/article/details/11135727

PHP实现AOP的雏形的更多相关文章

  1. 谈谈对AOP的理解

    Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之 ...

  2. 理解AOP

    http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面编程. ...

  3. Java笔记——面向切面编程(AOP模式)

    原文:http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切面 ...

  4. AOP小结

    AOP主要采用代理模式来实现的,静态代理(设计模式中的代理模式),动态代理(反射机制,实现InvocationHandler接口),cglib实现(采用继承方式,针对目标类生成子类,并覆盖方法进行增强 ...

  5. AOP入门(转)

    本文转自http://www.cnblogs.com/yanbincn/archive/2012/06/01/2530377.html Aspect Oriented Programming  面向切 ...

  6. Spring Aop 梳理

    Aspect Oriented Programming  面向切面编程.解耦是程序员编码开发过程中一直追求的.AOP也是为了解耦所诞生. 具体思想是:定义一个切面,在切面的纵向定义处理方法,处理完成之 ...

  7. 关于AOP的PIAB

    AOP:面向切面编程,也就是在运行过程中,按照需要动态加载功能块 PIAB:含义可以从下面提取 Microsoft Patterns & Practices团队在2007年发布的Enterpr ...

  8. AOP代理模式

    AOP 在Spring框架中被作为核心组成部分之一,的确Spring将AOP发挥到很强大的功能.最常见的就是事务控制.工作之余,对于使用的工具,不免需要了解其所以然.学习了一下,写了些程序帮助理解. ...

  9. 咋滴,不就是面试总考Spring的AOP吗,办它!

    作者:小傅哥 博客:https://bugstack.cn 沉淀.分享.成长,让自己和他人都能有所收获! 一.前言 为什么,你的代码总是糊到猪圈上? 怎么办,知道你在互联网,不知道你在哪个大厂.知道你 ...

随机推荐

  1. 使用idea搭建Spring boot开发初始环境

    准备工作 将以下代码加入idea的live template,命名为springbootStartup <parent> <groupId>org.springframewor ...

  2. MDD:使用模型驱动开发方式进行快速开发(多图预警)

    相信很多人跟我一样,不喜欢数据展示.列表分页.数据的增.删.改.查,这种简单又烦琐的搬砖活. 所以网上出现很多开源的代码生成工具,在多年前我也写过,根据模版生成简单的View.Action.Servi ...

  3. HDU 4305 Lightning(计算几何,判断点在线段上,生成树计数)

    Lightning Time Limit: 4000/2000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total S ...

  4. 谈谈 CSS 关键字 initial、inherit 和 unset

    开本系列,谈谈一些有趣的 CSS 题目,题目类型天马行空,想到什么说什么,不仅为了拓宽一下解决问题的思路,更涉及一些容易忽视的 CSS 细节. 解题不考虑兼容性,题目天马行空,想到什么说什么,如果解题 ...

  5. Oracle Form删除list项

    Oracle From中的list项点击后就会新增一个下拉列,此时可以使用 Ctrl+shift+< 进行删除

  6. eclipse 性能调优之内存分配

    转自:http://blog.csdn.net/defonds/article/details/6289236 如果觉得自己的 eclipse 比较慢,可以通过修改 %eclipse_home%/ec ...

  7. 流畅的python第四章文本和字节序列学习记录

    字符问题 把码位转化成字节序列的过程是编码,把字节序列转化成码位的过程是解码 把unicode字符串当成人类可读的文本,码位当成机器可读的, 将字节序列编程人类可读是解码,把字符串编码成字节序列是编码 ...

  8. (转)dubbo design

    框架设计 整体设计 图例说明: 图中左边淡蓝背景的为服务消费方使用的接口,右边淡绿色背景的为服务提供方使用的接口, 位于中轴线上的为双方都用到的接口. 图中从下至上分为十层,各层均为单向依赖,右边的黑 ...

  9. 15个CSS3和jQuery的超棒页面过渡效果教程

    来源:GBin1.com CSS3和jQuery从根本上改变了网页设计和程序开发.通过CSS3和jQuery,设计员和开发者不需要太多的精力或编码,就可以创造出非常 美丽令人叹惊的效果,同时还可以令你 ...

  10. JMeter 七:远程测试

    参考:http://jmeter.apache.org/usermanual/remote-test.html http://jmeter.apache.org/usermanual/jmeter_d ...