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 条回复
msg7086
2016 年 12 月 20 日
@hanzhao @Jakesoft
这两句话本来是完全等价的,不用考虑 $result 的类型。
拆开看:
if ($result === true) return true;
else return $result;
第一个分支和 return $result 是等价的。

@1762628386
你也要考虑到 TP 本身的年代久远。对一个十年前的框架提出现代的要求,是不是有些太过了。
如果你要现代化的框架,直接用 L 家,或者直接改用 Rails 好了。
dorentus
2016 年 12 月 20 日
@msg7086 其实 rails 出来也已经十多年了……
Jakesoft
2016 年 12 月 20 日
@msg7086
@jhdxr
@des

你们说的好有道理,是在下错了,我重点在关注 !== 这个符号的含义了。
cncqw
2016 年 12 月 20 日
thinkphp5 抄袭 laravel5 的,连快速入门文档都是抄的,只是把变量名改了,有一处还把 laravel 的一个函数直接复制过来,然而 thinkphp5 里面根本没有这个函数。
jinfeng333
2016 年 12 月 20 日
@cncqw 发个链接 发个截图 瞅瞅
jinfeng333
2016 年 12 月 20 日
TP 还是国内很用心维护的一个开源框架
enenaaa
2016 年 12 月 20 日
想看看懂 oop 的人是怎么写这个函数的
surfire91
2016 年 12 月 20 日
看了一眼好多歪楼的
1762628386
2016 年 12 月 20 日
@enenaaa 很明显 你不懂
enenaaa
2016 年 12 月 21 日
@1762628386 我写的 php 代码不超过 1000 行,不懂是正常的。 就想看懂的人是怎么写的。
msg7086
2016 年 12 月 21 日
@dorentus 十年前的 Rails 用起来也一般般,只不过 Ruby 社区比较偏向集中推一个东西,而不是自己搞十个不同的,所以发展得更快一些。我最近 1 年半都在用 Rails 1.x ,感觉和 4.x 差距还是非常大的,很多地方都做得不太顺滑。
nbhec2
2016 年 12 月 21 日
你是没见过更牛逼的,有个框架叫 OHSCE ,是做 PHP 物联网工控智能化通信的。是我在找所谓互联网+工控时发现的,整个框架里没有一个类 没有一个命名空间 没有所谓静态,只有变量和,常量,函数三种东西,而且还有一些 GOTO 语句,所以命名都是驼峰很长但不会和其它框架冲撞。你会发现拿市面上任何云云种种的 PHP 通信框架, SOCKET 框架在严谨的 NCS 控制工艺中都会或多或少的引发一些问题,但是唯独它没事。和作者交流过,作者是 C/汇编启蒙的人,你让一个一直做单片机的人写出 OOP 风格的代码是有悖于人家的思考习惯的。不同程序员都有自己的习惯自己的风格,不同的风格都能有顶级运行效果的代码出现,你会发现很多风格的思想都是超然于 OOP 存在的 OOP 只是降低了门槛很大程度上。 OHSCE 的 GIT , github.com/openibc/ohsce
mingyun
2016 年 12 月 25 日
@dsphper 这个问题入门时会碰到
abc123ccc
2016 年 12 月 29 日
又有人在黑 TP 了,搬个凳子过来看热闹。大家继续讨论。我只会 TP3.1
abc123ccc
2016 年 12 月 29 日
@holyghost 这是三目运算符吧,我小学毕业了。

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

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

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

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

© 2021 V2EX