Thinkphp 5.0 的代码我真是没法说了 太渣了吧 写框架的人不懂 OOP 思想?

2016 年 12 月 18 日
 1762628386

/** * 验证单个字段规则 * @access protected * @param string $field 字段名 * @param mixed $value 字段值 * @param mixed $rules 验证规则 * @param array $data 数据 * @param string $title 字段描述 * @param array $msg 提示信息 * @return mixed */ protected function checkItem($field, $value, $rules, $data, $title = '', $msg = []) { if ($rules instanceof \Closure) { // 匿名函数验证 支持传入当前字段和所有字段两个数据 $result = call_user_func_array($rules, [$value, $data]); } else { // 支持多规则验证 require|in:a,b,c|... 或者 ['require','in'=>'a,b,c',...] if (is_string($rules)) { $rules = explode('|', $rules); } $i = 0; foreach ($rules as $key => $rule) {

            if ($rule instanceof \Closure) {
                $result = call_user_func_array($rule, [$value, $data]);
            } else {
                // 验证
                if (is_numeric($key)) {
                    if (strpos($rule, ':')) {
                        list($type, $rule) = explode(':', $rule, 2);
                        if (isset($this->alias[$type])) {
                            // 判断别名
                            $type = $this->alias[$type];
                        }
                        $info = $type;
                    } elseif (method_exists($this, $rule)) {
                        $type = $rule;
                        $info = $rule;
                        $rule = '';
                    }else {
                        $type = 'is';
                        $info = $rule;
                    }
                } else {
                    $info = $type = $key;
                }

                // 如果不是 require 有数据才会行验证
                if (0 === strpos($info, 'require') || (!is_null($value) && '' !== $value)) {
                    // 验证类型
                    $callback = isset(self::$type[$type]) ? self::$type[$type] : [$this, $type];
                    // 验证数据
                    $result = call_user_func_array($callback, [$value, $rule, $data, $field]);
                } else {
                    $result = true;
                }
            }

            if (false === $result) {
                // 验证失败 返回错误信息
                if (isset($msg[$i])) {
                    $message = $msg[$i];
                    if (is_string($message) && strpos($message, '{%') === 0) {
                        $message = (substr($message, 2, -1));
                    }
                } else {
                    $message = $this->getRuleMsg($field, $title, $info, $rule);
                }
                return $message;
            } elseif (true !== $result) {
                // 返回自定义错误信息
                return $result;
            }
            $i++;
        }
    }
    return true !== $result ? $result : true;
}

我的天 这是啥~

尤其是下面这几行代码 我感觉要是在公司里写类似的 会被别人打死的

if (is_numeric($key)) { if (strpos($rule, ':')) { list($type, $rule) = explode(':', $rule, 2); if (isset($this->alias[$type])) { // 判断别名 $type = $this->alias[$type]; } $info = $type; } elseif (method_exists($this, $rule)) { $type = $rule; $info = $rule; $rule = ''; }else { $type = 'is'; $info = $rule; } } else { $info = $type = $key; }

13624 次点击
所在节点    PHP
115 条回复
EchoUtopia
2016 年 12 月 19 日
连基本的排版都做不好,也好意思出来喷
sagaxu
2016 年 12 月 19 日
@xuhaoyangx 用过可以不说,也可以吐槽一下,不然只能作为减分项了,要靠其它方面扳回来
TIGERB
2016 年 12 月 19 日
淡定,哈哈
windowsma
2016 年 12 月 19 日
@realpg 不用这么偏激吧。。我的启蒙框架
realpg
2016 年 12 月 19 日
@windowsma
已经执行多年这个政策了,误伤率极低,或者说根本没有。,
Nicksxs
2016 年 12 月 19 日
既然觉得这段代码不好,说 TP 不懂 OOP ,那么你就把它改成你觉得好的, OOP 的,然后贴出来,让大家评价下,不然作为一个码农只是光喷没啥意思, show me your code
jy04149886
2016 年 12 月 19 日
支持楼主
dsphper
2016 年 12 月 19 日
@realpg 大哥谁告诉你变量放在左边是常识?
举个==的例子:
```php
if($result == true) { // 正确写法

}
if($result = true) { // 手抖的错误写法,很多时候新手可能会犯这种错误。

}
if(true = $result) { // 这样解析器会直接抛出错误,就算少写了一个=号也不必担心出现永远等于 true 的问题,避免了不必要的寻错成本。

}
```
tabris17
2016 年 12 月 19 日
一根面条嗦到底,多爽气的代码呀
dsphper
2016 年 12 月 19 日
ThinkPHP ,代码质量确实参差不齐。这个框架的设计思想,我也是醉了。只考虑眼前用着爽,后期呵呵、。
Syc
2016 年 12 月 19 日
@keysona 这个问题貌似有人通过修改 php 的源代码后自行编译解决。把$改成啥看你自己咯。
blackjar
2016 年 12 月 19 日
自己 low 别说成搞 php 的 low
kancloud
2016 年 12 月 19 日
我真是服了 V2 的讨论氛围 有问题和建议直接去 github 提交 PR 不就行了 不能指望什么东西都是完美的,众人拾柴火焰高不是开源的本质么?正是有用户不断的参与贡献以及建议,才有了今天的 TP5 ,然后随着分工和多用户的提交,必然也会产生一些不完美的代码实现,但起码会保证单元测试 OK 以及没 BUG 这是大前提,规范问题,官方都是遵循 PSR-2 和 PSR-4 规范的,那些说着说那的用户 你们真正运营过一个国内的开源项目么?
run2
2016 年 12 月 19 日
Yoda conditions 在 php 并不常见(但其实 wordpress 的 PHP Coding Standards
里提起了 https://make.wordpress.org/core/handbook/best-practices/coding-standards/php/
同样它们的 https://make.wordpress.org/core/handbook/best-practices/coding-standards/javascript/ 也提过 但代码里并没有完全遵守

wordpress github repo tag 4.7
Searching 1701 files for "=== true" (case sensitive)
29 matches across 24 files

Searching 1701 files for "true ===" (case sensitive)
57 matches across 33 files

其实 Yoda conditions 让人变的更懒了,遇到这些对比时不就是该小心谨慎的写判断么, 所以个人认为是没有必要的,而且不该提倡的
hanzhao
2016 年 12 月 19 日
![]( http://p1.bqimg.com/567571/a834f54527d55520.png)
这是 Laravel5.1 也有不少这种写法啊。

至于纠结 return 这儿的,多读几次,这可不是始终返回 True

还是那句话,这是一个开源 PHP 框架,觉得代码不好,你可以帮助改善,或者置之不理也行,偏在这儿搞个大新闻...
des
2016 年 12 月 19 日
@Jakesoft 实在不太懂你怎么想的,不管这里$result 等于什么,返回的都是$result ,而且没有其他逻辑,所以有什么意义呢?
1762628386
2016 年 12 月 19 日
我天 $result 变量没毛病啊,关注点不应该是这一大坨缠绕在一起的代码么
jhdxr
2016 年 12 月 20 日
@Jakesoft 感觉你的点可能有一点偏差,`return true !== $result ? $result : true; `和`return $result;`不应该是完全等价的吗?写成后者的写法并不影响你说的返回 true/array 的情况?
jhdxr
2016 年 12 月 20 日
@1762628386 相比缠在一起的代码,你的排版(我知道你不是故意的,没在 V2EX 上发过几次代码的人都会掉坑里)让人完全没有去看代码的欲望。。。
msg7086
2016 年 12 月 20 日
@dsphper 只有写代码不写测试的时候才需要这种奇怪的 hack 。
而且这只能防止立即量写错。遇上 if ($a = $b) 的代码,照样会出问题。

与其用这种奇怪的 hack ,还不如配置一下 IDE ,报一下 if 里的赋值呢。
而且,熟手有多少人判断等于的时候会漏写一个等号。都成条件反射了。

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.ih06.com/t/328375

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX