首页 > 编程知识 正文

python核心技术与实战百度云,thinkphp与php的区别

时间:2023-05-04 08:39:15 阅读:11987 作者:3827

在项目开发过程中,代码模块强调尽量做到**高凝聚低耦合**,那么什么是耦合呢? 怎么做到低耦合呢?

很多学生都有疑问,我们将深入探讨这个问题,探讨如何通过编程解耦实现低耦合。

[success]

**大家听到的依赖注入、控件反转、切片导向编程(AOP )等概念的最终目的是理解耦合,提高代码复用和其他功能,熟练掌握这些概念是跳跃宝马的必由之路这里对这些概念进行了总结,详细内容请参考文档的相关章节。 ***

#什么是偶联?

[success]

**编程中常用的绑定是指一个功能模块与其他模块之间的依赖关系**

! ((3359 box.Kan cloud.cn/63f6d 60774459 fad 78 CAA 24725 f 287 c4_ 717 x543.png ) ) ) ) ) ) )。

这是一个典型的绑定示例,显然BB类工作正常,依赖于AA类。 因为tmdzt实例化了类AA,所以这意味着如果尝试检索类BB并将其放置用于其他项目,它将无法正常工作。 此时,可以说AA类和BB类结合度高或者结合在一起。

如果不理解为什么不同时将类AA也一起带走,即使在项目中自己封装了工具类,但如果类中使用了thinkphp框架附带的辅助函数,则将工具类带到laravel框架中是否要一起复制整个thinkphp框架? 请参考thinkphp的helper.php中的函数。 大多数在函数中调用系统的各个类库。 只复制一个函数没有意义

一个典型的例子是,在一些论坛上看到的一些帖子说这是一种比Rbac权限认证更灵活、更强大的Auth类认证方式。 见3http://www.thinkphp.cn/topic/4029.html

**Auth类的某些代码*

``````

protectedfunctiongetuserinfo ($ uid ) )。

{

static $user_info=[];

$ user=db :3360 name ($ this-config [ ' auth _ user ' ] );

//获取用户表的主键

$_PK=is_string($user-getPK ) )? $user-getPK(:'uid ';

if (! isset($user_info[$uid] ) {

$ user _ info [ $uid ]=$ user-where ($ _ PK,$ uid )-find );

}

返回$ user _ info [ $ uid ];

}

``````

很明显,这是获取用户信息的方法,并且正在使用` Db:name () `方法。 也就是说,如果这个类带到其他项目中,就有可能无法使用。 因为不知道其他项目是否有此方法,所以实际上从tp3.2版本迁移到5.0版本也无法使用。 需要更改代码

所以偶联的弊端很明显,当然作者在设计时可能没有考虑这个问题,但这并没有错

但是我们在设计项目的时候,应该要考虑这个问题。 所以,提倡高班聚会、低耦合

#如何降低、解除联轴器?

实现低耦合是指解除两类之间的耦合,解除类之间的直接关系,将直接关系转化为间接关系,以下给出几种解除耦合的思路。

##1.向结合对象搬入方式

! ((3359 box.Kan cloud.cn/CB 478 beea 82 d0d 93905 C4 FFE 1817476 b _ 686 x466.png ) ) ) ) ) )。

这里,可以通过在外部实例化对象,然后将其作为参数传递来实现解耦。 因为不需要在意对象是什么对象,只要对象中有` test `方法就可以了

典型的参考案例是thinkphp官方提到的依赖注入机制,实际进行的就是这个,只有他使用的自动输入参数

33559 www.Kan cloud.cn/manual/thinkphp5/215849

! ((3359 box.Kan cloud.cn/a 0145038 AC 41 f 70659 f 51986 B9 d 93824 _ 441 x572.png ) ) ) ) ) )。

构造函数强制指定要传递的类型为` Request '对象

实例化时,可以自动捕获此对象的实例。 关于如何导入,请参阅本手册的“反射系统”和“依赖注入”一章

这里还有一个问题。 这意味着在示例代码中,BB类指定了test方法,该方法只调用传递的对象。 如果想运行更负责的逻辑,甚至调用一些类中指定的方法,这里的调用方法会有点无力

因此,可以参考以下解耦幅度更大的方法

##2.通过入站执行逻辑方式

! [] ) 3359 box.Kan cloud.cn/8a 699 ff 2a 2d D5 E6 D4 c2b be 0a 72 daf 2d3_ 9

27x869.png)

这种方式看起来相对有点隐晦难懂,需要一定的基础

这里是直接把一个执行逻辑以闭包的形式传进去执行

里面的方式1比较简单

方式2涉及 `call_user_func_array` 函数,他接受两个参数,第一个参数为需要执行的函数,第二个参数为执行第一个参数时候传进去的参数

方式3为建立函数的反射再调用 invokeArgs 方式执行这个函数,可以参考 `反射类` 章节

他们做的事情是一样的,利用这个思想,可以在比起之前的解耦方式上更大幅度的扩展

典型的应用可以参考 iThink里extend文件夹下的 `namespace auth ` 中的 Auth 类 其中有个`execClosureList` 方法

这个方法的作用是把多个需要放在事务里执行的数据库操作逻辑写到多个闭包里,此方法是 iThink 里十分重要的方法,所有CURD方法都会经过这个方法需要大家十分熟悉 参考 `闭包事物构造器`章节

```

/**

* 闭包事物构造器

*

* @param callable $startTrans 启动事物注册方法

* @param callable $commit 提交事物注册方法

* @param callable $rollback 回滚事物注册方法

* @param array $list 事物列表

* @param string $err 当事物执行失败时返回的错误信息

* @param null $globalVariable 每个事物都可以作用到的共享变量,会push到每个事物元素的参数上

*

* @return bool

*/

public static function execClosureList(callable $startTrans , callable $commit , callable $rollback , $list = [] , &$err = null , &$globalVariable = null)

{

/*参数和错误信息可不传

* [

[

function($a, $b) {

//执行成功返回真

} ,

array(

1 ,

2 ,

) ,

'error massage'

] ,

[

function($a, $b) {

//执行成功返回真

} ,

array(

1 ,

2 ,

) ,

] ,

];

* */

call_user_func($startTrans);

try

{

$flag = true;

while (($flag !== false) && ($closure = array_shift($list)))

{

//没传参数设置参数为空数组

!is_array($closure[1]) && $closure[1] = [];

//传全局全局变量吧全局变量push到参数列表

!is_null($globalVariable) && $closure[1][] = &$globalVariable;

//执行闭包

$flag = call_user_func_array($closure[0] , $closure[1]);

($flag === false) && is_string($closure[2]) && ($err = $closure[2]);

}

($flag !== false) ? call_user_func($commit) : call_user_func($rollback);

return $flag;

} catch (Exception $e)

{

call_user_func($rollback);

$err = $e->getMessage();

return false;

}

}



```

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。