博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP实现AOP的雏形
阅读量:7191 次
发布时间:2019-06-29

本文共 1266 字,大约阅读时间需要 4 分钟。

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

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那样强大。

新闻类还是继承日志类,需要注意的是我们在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网站,两个域名在一个空间,如何做301转向
查看>>
Mysql系列五:数据库分库分表中间件mycat的安装和mycat配置详解
查看>>
Web References - There was an error downloading 'http://localhost:/xxx/xxx.asmx'
查看>>
Python之禅及释义
查看>>
laravel5.4 开发简书网站
查看>>
设置类库项目的程序集名称和默认命名空间
查看>>
对属性NaN的理解纠正和对Number.isNaN() 、isNaN()方法的辨析
查看>>
【转】iOS lame编译 arm64 armv7s armv7 x86_64 i386指令集
查看>>
LeetCode-二叉树的最大深度
查看>>
Linux内核剖析(五)Linux内核的构建过程
查看>>
19、生鲜电商平台-安全设计与架构
查看>>
webpack常见的配置总结 ---只是一些常见的配置
查看>>
Django_06_项目完成
查看>>
寻找子字符串int find_substr(char *s1, char *s2)
查看>>
apache配置文件参数优化
查看>>
Manifest.xml中不要出现重复的uses-permission声明
查看>>
UFS文件系统简明学习笔记
查看>>
详解Redis 的持久化机制--RDB和AOF
查看>>
就算神游 之四:富士山和富士游乐园 9
查看>>
linux 学习 12 服务管理
查看>>