V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1762628386
V2EX  ›  PHP

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

  •  2
     
  •   1762628386 · 2016-12-18 01:07:25 +08:00 · 11666 次点击
    这是一个创建于 2900 天前的主题,其中的信息可能已经有所发展或是发生改变。

    /** * 验证单个字段规则 * @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; }

    第 1 条附言  ·  2016-12-19 20:20:46 +08:00
    楼主只是深夜重构 TP 的代码顺便吐槽一下 淡定~
    115 条回复    2016-12-29 15:11:54 +08:00
    1  2  
    msg7086
        101
    msg7086  
       2016-12-20 05:25:00 +08:00
    @hanzhao @Jakesoft
    这两句话本来是完全等价的,不用考虑 $result 的类型。
    拆开看:
    if ($result === true) return true;
    else return $result;
    第一个分支和 return $result 是等价的。

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

    你们说的好有道理,是在下错了,我重点在关注 !== 这个符号的含义了。
    cncqw
        104
    cncqw  
       2016-12-20 11:13:50 +08:00
    thinkphp5 抄袭 laravel5 的,连快速入门文档都是抄的,只是把变量名改了,有一处还把 laravel 的一个函数直接复制过来,然而 thinkphp5 里面根本没有这个函数。
    wujunze
        105
    wujunze  
       2016-12-20 13:09:30 +08:00
    @cncqw 发个链接 发个截图 瞅瞅
    wujunze
        106
    wujunze  
       2016-12-20 13:10:03 +08:00
    TP 还是国内很用心维护的一个开源框架
    enenaaa
        107
    enenaaa  
       2016-12-20 13:20:20 +08:00
    想看看懂 oop 的人是怎么写这个函数的
    surfire91
        108
    surfire91  
       2016-12-20 20:36:08 +08:00
    看了一眼好多歪楼的
    1762628386
        109
    1762628386  
    OP
       2016-12-20 22:39:32 +08:00
    @enenaaa 很明显 你不懂
    enenaaa
        110
    enenaaa  
       2016-12-21 10:13:04 +08:00
    @1762628386 我写的 php 代码不超过 1000 行,不懂是正常的。 就想看懂的人是怎么写的。
    msg7086
        111
    msg7086  
       2016-12-21 13:58:16 +08:00
    @dorentus 十年前的 Rails 用起来也一般般,只不过 Ruby 社区比较偏向集中推一个东西,而不是自己搞十个不同的,所以发展得更快一些。我最近 1 年半都在用 Rails 1.x ,感觉和 4.x 差距还是非常大的,很多地方都做得不太顺滑。
    nbhec2
        112
    nbhec2  
       2016-12-21 14:39:07 +08:00 via Android
    你是没见过更牛逼的,有个框架叫 OHSCE ,是做 PHP 物联网工控智能化通信的。是我在找所谓互联网+工控时发现的,整个框架里没有一个类 没有一个命名空间 没有所谓静态,只有变量和,常量,函数三种东西,而且还有一些 GOTO 语句,所以命名都是驼峰很长但不会和其它框架冲撞。你会发现拿市面上任何云云种种的 PHP 通信框架, SOCKET 框架在严谨的 NCS 控制工艺中都会或多或少的引发一些问题,但是唯独它没事。和作者交流过,作者是 C/汇编启蒙的人,你让一个一直做单片机的人写出 OOP 风格的代码是有悖于人家的思考习惯的。不同程序员都有自己的习惯自己的风格,不同的风格都能有顶级运行效果的代码出现,你会发现很多风格的思想都是超然于 OOP 存在的 OOP 只是降低了门槛很大程度上。 OHSCE 的 GIT , github.com/openibc/ohsce
    mingyun
        113
    mingyun  
       2016-12-25 16:18:06 +08:00
    @dsphper 这个问题入门时会碰到
    abc123ccc
        114
    abc123ccc  
       2016-12-29 15:10:52 +08:00
    又有人在黑 TP 了,搬个凳子过来看热闹。大家继续讨论。我只会 TP3.1
    abc123ccc
        115
    abc123ccc  
       2016-12-29 15:11:53 +08:00
    @holyghost 这是三目运算符吧,我小学毕业了。
    1  2  
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   1029 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 27ms · UTC 20:11 · PVG 04:11 · LAX 12:11 · JFK 15:11
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.