PHP实现AOP的雏形
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
相关文章
- 14.PHP_PHP与XML技术
- php之快速入门学习-17(PHP 命名空间)
- PHP通过反射来得到类,以及一些基本的应用
- PHP+MySQL实现基本登录功能(1+X Web前端开发中级 例题)——初稿
- PHP 之 FastCGI 与 mod_php 详解
- Nginx + php-fpm 执行 PHP 脚本超时 报错 502 Bad Gateway + 504 Gateway Time-out 的解决办法
- PHP 错误与异常 笔记与总结(3)PHP 配置文件(php.ini)中与错误相关的选项 与 设置错误级别
- PHP 设计模式 笔记与总结(2)开发 PSR-0 的基础框架
- PHP+jQuery 列表分页类 ( 支持 url 分页 / ajax 分页 )
- Jquery Ajax xml版Get请求PHP
- Centos PHP+Apache执行exec()等Linux脚本权限设置的详细步骤
- php常见术语
- ID过滤靓号写法(PHP和Nodejs版本)
- 转 php 框架 Php 依赖框架
- php 获取汉字笔画
- lumen 支持多文件上传及php 原生多文件上传
- 如何修改两个PHP版本,php-v和phpinfo两个不同的版本
- PHP--关于模板的原理和解析(php模板原理)
- php模板原理PHP模板引擎smarty模板原理浅谈
- PHP下jQuery的学习
- atitit.php 流行框架 前三甲为:Laravel、Phalcon、Symfony2 attilax 总结
- Docker php-fpm 下载了GD扩展库依然不能生成验证码
- php 单进程SAPI生命周期
- DokuWiki 开源框架 PHP DokuWiki
- PHP PHPStorm 解决运行报错 502 Bad Gateway,配置PHP Interpreter,配置php.exe