从今天开始,陆续给大家点评一些垃圾代码。但愿对大家有帮助。
先看一段代码:
/** * 启动事务 * @access public * @return bool|mixed * @throws \Exception */ public function startTrans() { $this->initConnect(true); if (!$this->linkID) { return false; } ++$this->transTimes; try { if (1 == $this->transTimes) { $this->linkID->beginTransaction(); } elseif ($this->transTimes > 1 && $this->supportSavepoint()) { $this->linkID->exec( $this->parseSavepoint('trans' . $this->transTimes) ); } } catch (\PDOException $e) { if ($this->isBreak($e)) { return $this->close()->startTrans(); } throw $e; } catch (\Exception $e) { if ($this->isBreak($e)) { return $this->close()->startTrans(); } throw $e; } catch (\Error $e) { if ($this->isBreak($e)) { return $this->close()->startTrans(); } throw $e; } }
这是国内某开源十余年的知名框架的核心代码。
很明显,虽然有什么try catch结构,但无法遮掩其代码功底之差,思路的初级。
第一点,把数据库链接与事务搅在的一起。虽然用华丽的链式操作,但是,反而弄巧成拙。
为什么这么说,因为,链接就是在此类中处理的。此类中就有函数:
abstract protected function parseDsn($config); 所以,这完全违反了单一职责原则。
当然,写在一起,处理得好就算了。可是,万万没有想到的是,在catch中并没有完全逃脱。
因为,这一行:return $this->close()->startTrans();
不是说,这一行重新开始有问题,但是,本质上,它根本没有重新开始,因为,
前面有了什么?这一行:
++$this->transTimes;
这是在try catch之外的,本来就是一个记数器。可是,写这段代码的人可参没有想到, 你还没有beginTransaction 成功,你就把计数器给加了。 而出错时,并没有处理这个计数器。所以,这个框架数据库频繁出错,大家一定明白错在何处了。
再看另一个代码:
/** * Start a new database transaction. * * @return void * @throws \Exception */ public function beginTransaction() { $this->createTransaction(); $this->transactions++; $this->fireConnectionEvent('beganTransaction'); } /** * Create a transaction within the database. * * @return void */ protected function createTransaction() { if ($this->transactions == 0) { try { $this->getPdo()->beginTransaction(); } catch (Exception $e) { $this->handleBeginTransactionException($e); } } elseif ($this->transactions >= 1 && $this->queryGrammar->supportsSavepoints()) { $this->createSavepoint(); } }
这段代码思路就非常清晰,并且,代码简单易懂。 即beginTransaction未成功之前,什么都不做。
当然,这是Laravel框架的代码。二者肯定不是一个级别!
相关推荐
PHP开发典型模块大全 人民邮电出版社 代码 2-13章
php典型模块与项目实战源代码,全集,包含全部的源代码目录和源代码文件,和框架引擎介绍文档以及源码
php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码php聊天代码...
PHP开发典型模块大全 人民邮电出版社 14-25章代码
该压缩包包含了由明日科技编写,人民邮电出版社出版的PHP开发典型模块丛书里边的全部代码。总共分两部分上传。该部分为第一部分。
全功能PHP代码全功能PHP代码全功能PHP代码全功能PHP代码
开源代码,学习无忧,可通过源码学习PHP开发的具体细节,适用于初学PHP语言的学者。
10个救人的php代码 php源码 php代码
php留言板代码,里面有详细的源代码。希望能够帮助一些初学者。
PHP在线压缩代码PHP在线压缩代码PHP在线压缩代码PHP在线压缩代码
php 生成SITEMAP 代码 部分源码 //网址 private $weburl='http://www.wna.com/'; //更新的频率 private $frequency='weekly'; //always、hourly、daily、weekly、monthly、yearly、never //需要显示出来的扩展...
PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录管理系统设计文档+源代码+SQL文件PHP实现的通讯录...
目录:网盘文件永久链接 第27课:漏洞实战之越权漏洞mp4 第26课:漏润实战之任意文件删除漏洞mp4 第25课:漏洞实战之任意文件写入漏洞mp4 第24课:漏洞实战之CSRF漏洞mp4 ...第1课:环境配置及审计工具介绍mp4
PHP典型头部文件代码及相关说明.pdf
php典型模块与项目实战大全-明日科技 11-15章代码+其他内容,从光盘拷贝。
代码编写器,包括php代码编写,java代码编写、工具。
Oracle PHP代码生成器, 一个强大的Oracle GUI程序,用于生成高质量的Oracle PHP代码, 无论是个人学习还是研究,都是一款很不错的工具,尤其是能为Oracle生成高质量的代码,还提供了大量的模板和范例,值得玩味。
PHP开发典型模块大全源码
一个用php做的统计php代码行数的程序