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 条回复
yxzblue
2016 年 12 月 18 日
@1762628386 哥们你应该去看了 TP5 以前的版本,那会被你喷成狗一样。我只是让你省省口水,多做点实事。 You can you up...
chenyachao
2016 年 12 月 18 日
虽然我没用过 tp ,也不打算用,但是觉得吐槽一个维护了很多年的东西还是给点包容比较好~
williamx
2016 年 12 月 18 日
当时选型的时候优先考虑过 TP , 想毕竟是国内的产品,文档等方面会比较顺畅,但是看了网站和代码,感觉扑面的一股浓浓的山寨风,不得已放弃了。
jok3r
2016 年 12 月 18 日
@fthvgb1 再读一遍
liuxu
2016 年 12 月 18 日
@Syc 楼下 emacs 用户不服
keysona
2016 年 12 月 18 日
。。。这种时候不是要 fork ,改了之后 pr 吗?

看了下,这个应该是开源的吧?

我开始写代码也是不考虑什么 oop 之类的,先把功能做出来,之后重构的。
keysona
2016 年 12 月 18 日
话说,到现在还是接受不了 php 的$。。。

个人觉得,不符合美感...

个人感受,求不喷...
jhdxr
2016 年 12 月 18 日
@keysona $有一个很大的好处,例如`$class`,变量想叫什么就叫什么,不用考虑有哪些保留字
lamCJ
2016 年 12 月 18 日
TP 能用 站在使用的角度并没多大影响 但是个人认为不优雅(个人认为) 可读性差 多层嵌套很普遍 能把你看晕

记得当时有团队成员在操作 session 时遇到点问题 想看看 TP 怎么写的 直到我看到了那个 `session()` 方法 ...

后来我强制性让他们舍弃了 TP 并把可读性当作是团队开发第一原则 我带领大家熟悉 Laravel 目前为止都写的很爽 更重要的是他们跟着也学到了很多 Modern PHP 的东西 这是他们用 TP 时没有学到的
zi
2016 年 12 月 18 日
我真的想知道,为什么 "return true !== $result ? $result : true;" 不写成 "return $result;" ?
sagaxu
2016 年 12 月 18 日
@wy315700 编译型语言,编译器会提示,不用 IDE 总要用编译器吧。脚本也有各种代码质量检查工具。更可笑的是,我竟然看到有人在 java 里也这么写,漏掉一个=直接语法错误,编译都编不过去的,倒过来写纯属蛋疼。
xuhaoyangx
2016 年 12 月 19 日
我只能说,你觉得你可以,就请自己写一个维护。

既然你要用它,那有什么好喷的?
大厂中的代码不乏这样的,有什么会打死的,只要功能能实现,且快,无安全问题,为何不行?
曾在某 xx 宝 交易系统的 外包公司做过,中间件用 c++写,前端数据交互用 java ,你不知道那个才就做丑,水平参差不齐的,但别人实现了功能,性能能支持股市级别的负载量,这些代码你又能说什么呢。

顺便说 true !== $result 这玩意,以前有人对咱说过,是避免 if 下写错了,而的形成习惯
@sagaxu if while 等,编译型语言能通过
liuzhanpeng
2016 年 12 月 19 日
5.0 已经有所改善了,不信你看看 3.x 版本
billwang
2016 年 12 月 19 日
@des 当然,你写都没写过怎么可能知道别人写的好坏?
kancloud
2016 年 12 月 19 日
你喜欢一个框架自然会有喜欢的理由 你讨厌一个框架自然也会有讨厌的理由,这个道理放到任何框架都成立!
Jakesoft
2016 年 12 月 19 日
@quericy 本来不想再回这个帖子的…如果我有什么不对可随意吐槽

因为 PHP 动态语言的关系,$result 可能是个数组,比如这里,这个验证可能没通过,于是返回错误的信息,都放在这个数组里,如果判断 result 强等于 true 说明验证通过,如果不是,说明没通过,并返回错误信息的数组


---

我也不是很喜欢这种“两个标准”的写法,一般 return 都会返回具体类型或者 null
zooandzoo
2016 年 12 月 19 日
你可以自己写一个框架,然后用它做做项目,回头看看比 TP 差很远,不要眼高手低。
misaka19000
2016 年 12 月 19 日
开源本来不就是你不行我来上吗?期待楼主的 PHP 框架~~
sagaxu
2016 年 12 月 19 日
@xuhaoyangx JAVA 里过不了, if 里面的条件必须是 bool 类型, int 是不能自动转化为 bool 类型的。如果直接跟 true 和 false 比较,应该写 if(a)而不是 if(a==true)。在 C 和 C++里面,编译器会给一个大大的 warning ,所以不必担心不小心写错。

业务代码和框架对代码质量的要求不同, BAT 里糟糕的代码不少,但是优秀的代码也很多,重要的地方都有 review 的。

用过 tp 的不招,培训班毕业的不招,这都是经验总结,无数坑爹经历换来的。
xuhaoyangx
2016 年 12 月 19 日
@sagaxu php 方面就只用过 tp\laravel 岂不是上黑名单了

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

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

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

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

© 2021 V2EX