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. python 实现简单的KNN算法

    from numpy import * import operator def createDataSet(): group = array([[3,104],[2,100],[1,81],[101, ...

  2. Linux进程(作业)的查看和杀死 牛

    http://www.cnblogs.com/geaozhang/p/6910151.html

  3. 【maven】ecplise新建maven项目 报错Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resources-plugin

    在ecplise上新建maven项目 报错: Could not calculate build plan: Plugin org.apache.maven.plugins:maven-resourc ...

  4. 关于如何避免Android中Bitmap引起的OutOfMemoryError

    在Android中处理大图片不是一件很随意的事情,因为通常我们使用的是内置的BitmapFactory解码图片的,而BitmapFactory往往会因为图片过大而遇到OutOfMemoryError的 ...

  5. Win32 API UART编程

    下面是一个使用Win32 API进行UART编程的简单示例. #include <windows.h> #include <stdio.h> int WINAPI WinMai ...

  6. gmock学习01---Linux配置gmock

    本文目的 本文主要介绍gmock 1.6.0版本在Linux上如何部署和使用. gmock是做什么的? 使用C++手动编写mock对象将会是一件十分耗时,易于出错,枯燥乏味的事情.gmock提供一整套 ...

  7. CentOS 下 LNMP 环境配置

    安装配置 Nginx 安装配置 MySQL 安装配置 PHP Nginx 与 PHP-FPM 集成 环境配置验证   LNMP 环境代表 Linux 系统下 Nginx + MySQL + PHP 网 ...

  8. Verilog语法

    语法子集很小,易用. 模块:module…endmodule 端口:input,output,inout(双向特殊) inout比较难用,有一张真值表,需要大家观察后书写,基本原则就是输入时一定是高阻 ...

  9. mybatis paramType String Error

    我这么写的 <select id="getHotPlayersByDate" parameterType="java.lang.String" resul ...

  10. 使用JTextArea示例

    相对于JLabel显示提示文字,JTextArea有一个先天优势:文字可以拷贝出来.经过下面设置它也能在外观上和JLabel一致. 代码如下: JTextArea txtArea=new JTextA ...