前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >PHP AOP面向切面编程

PHP AOP面向切面编程

作者头像
猿哥
发布2019-07-25 21:33:27
1.3K0
发布2019-07-25 21:33:27
举报

AOP:Aspect Oriented Programming(面向切面编程)


字面解析:这里的切面(Aspect) 通常是指类的一个实例方法,也就是说其实我们只要在类的一个实例方法执行前或后面挂载前置或后置方法,有点像钩子,其实目的都是一样的,都是为了切分和扩展相应方法的功能,而不需要在原始方法里面改动。

题外话:什么是实例方法?就是类的方法前面没有 static 关键字修饰,并且只有类的实例被创建(new)出来之后才可以使用的方法。

实例1:模拟数据库的建立连接前后的动作

<?php namespace Mysql; class Database { public function beforeConnect($connStr) { echo "before connect\n"; } public function afterConnect($connStr) { echo "after connect\n"; } public function connect($connStr) { $beforeMethod = "before".ucfirst(__FUNCTION__); $args = func_get_args(); if(method_exists($this,$beforeMethod)){ call_user_func_array([$this,$beforeMethod], $args); } // todo: connect the database echo "connecting\n"; $afterMethod = "after".ucfirst(__FUNCTION__); if(method_exists($this,$afterMethod)){ call_user_func_array([$this,$afterMethod], $args); } } } $db = new Database();

$db->connect("...");

运行结果如下:

before connect connecting after connect

实例2:安装PECL C扩展,PHP AOP,仅支持PHP5.5

项目地址:https://github.com/AOP-PHP/AOP (可直接看源码)

假定有下面的类:

<?php class MyServices { public function doAdminStuff1 () { //some stuff only the admin should do echo "Calling doAdminStuff1"; } public function doAdminStuff2 () { //some stuff only the admin should do echo "Calling doAdminStuff2"; } }

我们接下来注入关注面:

aop_add_before('MyServices->doAdmin*()', 'adviceForDoAdmin');

其中adviceForDoAdmin:

function adviceForDoAdmin () { if ((! isset($_SESSION['user_type'])) || ($_SESSION['user_type'] !== 'admin')) { throw new Exception('Sorry, you should be an admin to do this'); } }

其实上面的代码作用很简单,就是当我们调用 MyServices 类下面的 doAdmin 开头的实例方法前先执行一遍 adviceForDoAdmin 方法,这个 C 扩展是不是挺神奇的。

其实,phper平时写业务代码比较多,较少接触到AOP相关的概念,若你看过某些开源框架的源码或者自己设计过需要AOP切分的业务逻辑那就另当别论了。然而Java里面包含了很多AOP的经典设计范例,比较知名的如Spring AOP。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2018-08-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 PHP技术大全 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档