V2EX = way to explore
V2EX 是一个关于分享和探索的地方
Sign Up Now
For Existing Member  Sign In
1762628386
V2EX  ›  PHP

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

  •  2
     
  •   1762628386 · Dec 18, 2016 · 13051 views
    This topic created in 3421 days ago, the information mentioned may be changed or developed.

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

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

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

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