magic php,MagicTransformer.php

MagicTransformer.php

PHP的双向映射模型

设计动机

在PHP开发之中,把一种模型变化到另一种模型是非常常见的操作。传统的方式是写两个transformToB和setFromB方法。然而,在很多时候我们发现其中的逻辑基本是相同的,只不过一个构造对象,一个从对象中析出信息。

因此就有了这个库:变换模型一次定义,双向使用。

用法

require_once 'magic_transformer.php';

use MagicTransform\M as M;

一个映射器(mapper)就是实现 MagicTransform\iBidirectionTrans类的实例。

interface iBidirectionTrans {

public function forward_map($left_val); //正向映射

public function reverse_map($right_val, &$left_obj); //逆向映射

}

//定义映射关系

$trans = M::make_mapper(

[

'abc' => M::$self[0], // 'abc'对应的键值就是$left[0]

'ccc' => M::make_chain( // 正向映射时,将第一个映射器的值传给第二个;反向则相反

M::$self[1], // make_chain的第二个参数接收到$left是这里的$left[1]

[

'yyy' => M::$self // self是一个始终将自身映射到自身的映射器

]

),

'ddd' => M::self['eee']['fff'], // 正向映射$left['eee']['fff'], 反向则设置$left['eee']['fff']

'eee' => M::make_chain(

M::$self[2], // 现在make_list_mapper所接受到到$left是这里的$left[2]

M::make_list_mapper( // 将参数的mapper作用到$left的每一项上,反向则先获取每一项再构造出一个数组

M::make_func_mapper( // 自定义映射器!

function($left_val) { // 正向

return $left_val + 1;

},

function ($right_val, &$left_obj) { // 反向

$left_obj = $right_val - 1;

}

)

)

)

]

);

$left = ['0th', '1st', [1,2,3], 'eee' => ['fff' => 4]];

$right = $trans->forward_map($left); // 正向映射

print_r($right);

/*

* Array

(

[abc] => 0th

[ccc] => Array

(

[yyy] => 1st

)

[ddd] => 4

[eee] => Array

(

[0] => 2

[1] => 3

[2] => 4

)

*/

// 我们来修改一下$right

$right['abc'] = '0th0th';

$right['ccc']['yyy'] = ['1st1st'];

$right['ddd'] = 100;

$right['eee'][1] = 7;

$left = array(); // 这里你可以传一个自己的ORM对象进来

$trans->reverse_map($right, $left);

print_r($left);

/*

Array

(

[0] => 0th0th

[1] => Array

(

[0] => 1st1st

)

[eee] => Array

(

[fff] => 100

)

[2] => Array

(

[0] => 1

[1] => 6

[2] => 3

)

)

*/

API

所有的API都定义在MagicTransform命名空间下

Interface

iBidirectionTrans

interface iBidirectionTrans {

public function forward_map($left_val);

public function reverse_map($right_val, &$left_obj);

}

所有mapper都应该实现这个接口。

Mapper与mapper构造辅助函数

所有的这些都在M类中被定义。

make_key_mapper

映射$left[$key1][$key2]...

M::make_key_mapper('abc', 'def'); //$left['abc']['def']

__0/__1/__2/__3

make_key_mapper(0), ..., make_key_mapper(3) 的别名

self

是一个始终映射到自身的映射器。重载了魔术方法[],其效果与make_key_mapper相同。

make_chain

参数是映射器。

正向分别按Arg1, Arg2, ..., ArgN的顺序映射,将前一个输出作为后一个输入;反向则逆序。

M::make_chain(M::$__0, M::$__1); // $left[0][1], 和make_key_mapper(0, 1)等价

make_list_mapper

将mapper作用到$left这个数组的每一项上

M::make_list_mapper(M::$__0); //[$left[0][0], $left[1][0], ...]

make__func_mapper

自定义映射器,第一个参数是正向,第二个是反向。

M::make_func_mapper( // 自定义

function($left_val) { // 正向

return $left_val + 1;

},

function ($right_val, &$left_obj) {

$left_obj = $right_val - 1;

}

); // $left + 1

make_mapper

自动将一个对象/数组等转化为映射器。

make_mapper(

[

'aaa' => M::$__0

]

);

许可证

Apache License.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值