首页 > 作文

PHP面向切面编程组件

更新时间:2023-04-07 05:57:47 阅读: 评论:0

我们使用mvc框架,例如ci、yii、cakephp,原因之一就是:能够使代码便于维护。

但当业务逻辑不断复杂时,在控制器中调用模型中的方法会越来越臃肿。

面向切面的思路,是解决不断变化的业务逻辑与写出便于维护代码的解决方法之一。

下面是向切面式,是根据aop的思路设计的。

<?php
if (function_exists(‘__autoload’)) {
trigger_error(“extension: it looks like your code is using an __席慕容时光九篇autoload() function. extension us spl_autoload_register() which will bypass your __autoload() function and may break autoloading.”, e_ur_warning);
}

spl_autoload_register(array(‘extensionfactory’, ‘autoload’));

class extensionfactory {

private static $extfamily = null;
private static $_class = array(
‘extension’ => ‘/extension.php’,
‘extensionfamily’ => ‘/extensionfamily.php’
);

/**
* class autoloader. this method is provided to be invoked within an
* __autoload() mag顶点坐标的公式ic method.
* @param string $classname the name of the class to load.
*/
public static function autoload() {
foreach(lf::$_class as $v){
require_once dirname(__file__) . $v;
}
}

/**
* 必须先调用此方法来实例化扩展族,才能调用addextension\removeextension等
* @return extensionfamily
*/
public static function createextension(){
lf::$extfamily = new extensionfamily();
return lf::$extfamily;
}

public static function removeextension($extname){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
unt(lf::$extfamily->_extensionarray[$extname]);
}
}

public static function addextension($extname, extension $ext){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
lf::$extfamily->_extensionarray[$extname] = $ext;
}
}

public static function removeallextension(){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
foreach(lf::$extfamily->_extensionarray as $extname=>$ext){
unt(lf::$extfamily->_extensionarray[$extname]);
}
}
}
}
<?php
if (function_exists(‘__autoload’)) {
trigger_error(“extension: it looks like your code is using an __autoload() function. extension us spl_autoload_register() which will bypass your __autoload() function and may break autoloading.”, e_ur_warning);
}

spl_autoload_register(array(‘extensionfactory’, ‘autoload’));

class extensionfactory {

private static $extfamily = null;
private static $_class = array(
‘extension’ => ‘/extension.php’,
‘extensionfamily’ => ‘/extensionfamily.php’
);

/**
* class autoloader. this method is provided to be invoked within an
* __autoload() magic method.
* @param string $classname the name of the class to load.
*/
public static function autoload() {
foreach(lf::$_class as $v){
require_once dirname(__file__) . $v;
}
}

/**
* 必须先调用此方法来实例化扩展族,才能调用addextension\removeextension等
* @return extensionfamily
*/
public static function createextension(){
lf::$extfamily = new extensionfamily();
return lf::$extfamily;
}

public static function removeextension($extname){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
unt(lf::$extfamily->_extensionarray[$extname]);
}
}

public static function addextension($extname, extension $ext){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
lf::$extfamily->_extensionarray[$extname] = $ext;
}
}

public static function removeallextension(){
if(is_null(lf::$extfamily)){
throw new exception(“plea createextension first”);
return fal;
}el{
foreach(lf::$extfamily->_extensionarray as $extname=>$ext){
unt(lf::$extfamily->_extensionarray[$extname]);
}
}
}
}

<?php
/**
* 扩展家族
*
* @author mr.jin
*/
class extensionfamily implements extension{
public $_extensionarray = array();

/**
*
* @param type $extname 扩展名
* @param extension $ext 实现extension的对象
*/
public function addextension($extname, extension $ext){
$this->_extensionarray[$extname] = $ext;
}

public function befor包拯的故事eappend(&$params){
foreach($this->_extensionarray as $ext自转和公转){
$ext->beforeappend($breaks my heartparams);
}
}

public function afterappend(&$params) {
foreach($this->_extensionarray as $ext){
$ext->afterappend($params);
}
}
}

?>
<?php
/**
* 扩展家族
*
* @author mr.jin
*/
class extensionfamily implements extension{
public $_extensionarray = array();

/**
*
* @param type $extname 扩展名
* @param extension $ext 实现extension的对象
*/
public function addextension($extname, extension $ext){
$this->_extensionarray[$extname] = $ext;
}

public function beforeappend(&$params){
foreach($this->_extensionarray as $ext){
$ext->beforeappend($params);
}
}

public function afterappend(&$params) {
foreach($this->_extensionarray as $ext){
$ext->afterappend($params);
}
}
}

?>

<?php
/**
* 扩展接口
*
* @author mr.jin
*/
interface extension {
public function beforeappend(&$params);

public function afterappend(&$params);
}

?>
<?php
/**
* 扩展接口
*
* @author mr.jin
*/
interface extension {
public function beforeappend(&$params);

public function afterappend(&$params);
}

?>

以上三个文件实现了简单的aop组件。

下面是demo:

<?php
/**
* 自定义extension
* 用户积分extension
* 根据用户是否登录,决定此次消费是否记录用户积分
*
* @author mr.jin
*/
class exampleextension implements extension {
public $check=fal;

public function beforeappend(&$islogin) {
if($islogin){
$this->check = true;
}
}

public function afterappend(&$pointer) {
if($this->check){
//add pointer
}el{
echo ‘未登录用户,积分不录入’;
return;
}
}

}

?>
<?php
/**
* 自定义extension
* 用户积分extension
* 根据用户是否登录,决定此次消费是否记录用户积分
*
* @author mr.jin
*/
class exampleextension implements extension {
public $check=fal;

public function beforeappend(&$islogin) {
if($islogin){
$this->check = true;
}
}

public function afterappend(&$pointer) {
if($this->check){
//add pointer
}el{
echo ‘未登录用户,积分不录入’;
return;
}
}

}

?>

demo.php
<?php
require_once(‘extensionfactory.php’);//导入组件本身

require_once(‘exampleextension.php’);//导入扩展

$ext = extensionfactory::createextension();

extensionfactory::addextension(‘example’, new exampleextension());//积分录入功能

/*
* 按照需求的变化,可以增加相应的extension.
* eg.
* 新需求:新增会员类型,根据不同类型,进行价格优惠。
* 实现思路:
* 一、建立卡号类型工厂
* 二、建立niormemberextension、putongmeberextension.
* 三、工厂方法根据会员类型addextension
*/

$islogin = fal; //假设用户未登录

$ext->beforeappend($islogin);


/**
* 面向切面编程,最重要一点是:必须先分析出整个业务处理中,哪个才是重点。
* 这里的重点是订单的入库。
* 在订单入库之前可能业务逻辑不断增加,例如:登录验证、卡上余额验证等
* 在订单入库之后:积分处理、订单监控等
*/
echo “此处是主要业务逻辑:订单入库\r\n”;

$pointer = 100;

$ext->afterappend($pointer);
<?php
require_once(‘extensionfactory.php’);//导入组件本身

require_once(‘exampleextension.php’);//导入扩展

$ext = extensionfactory::createextension();

extensionfactory::addextension(‘example’, new exampleextension());//积分录入功能

/*
* 按照需求的变化,可以增加相应的extension.
* eg.
* 新需求:新增会员类型,根据不同类型,进行价格优惠。
* 实现思路:
* 一、建立卡号类型工厂
* 二、建立niormemberextension、putongmeberextension.
* 三、工厂方法根据会员类型addextension
*/

$islogin = fal; //假设用户未登录

$ext->beforeappend($islogin);

/**
* 面向切面编程,最重要一点是:必须先分析出整个业务处理中,哪个才是重点。
* 这里的重点是订单的入库。
* 在订单入库之前可能业务逻辑不断增加,例如:登录验证、卡上余额验证等
* 在订单入库之后:积分处理、订单监控等
*/
echo “此处是主要业务逻辑:订单入库\r\n”;

$pointer = 100;

$ext->afterappend($pointer);
运行结果:
此处是主要业务逻辑:订单入库
未登录用户,积分不录入

摘自 god’s blog

本文发布于:2023-04-07 05:57:46,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/zuowen/629e9435f0840f84296f4452e50fee13.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

本文word下载地址:PHP面向切面编程组件.doc

本文 PDF 下载地址:PHP面向切面编程组件.pdf

标签:订单   积分   用户   业务
相关文章
留言与评论(共有 0 条评论)
   
验证码:
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图