Thinkphp 5.0 的代码我真是没法说了 太渣了吧 写框架的人不懂 OOP 思想? - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
1762628386
V2EX    PHP

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

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

    /** * 验证单个字段规则 * @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  
    1762628386
        1
    1762628386  
    OP
       2016-12-18 01:07:53 +08:00
    ```
    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; }
    ```
    1762628386
        2
    1762628386  
    OP
       2016-12-18 01:13:21 +08:00
    本来打算重写 tp 的验证放自己的项目上用 一看这代码完全就是单纯为了实现[验证]这个功能,根本没法复用, 貌似连个最基本的后期静态绑定都没有啊
    hronro
        3
    hronro  
       2016-12-18 02:07:24 +08:00
    这个排版,我也受不了
    orderc
        4
    orderc  
       2016-12-18 08:24:58 +08:00
    论代码可读性的重要
    vugusurk
        5
    vugusurk  
       2016-12-18 08:52:44 +08:00
    日常黑 ThinkPHP
    瞅瞅这个? https://github.com/illuminate/validation
    vugusurk
        6
    vugusurk  
       2016-12-18 08:55:16 +08:00
    哦,不对,是这个: https://symfony.com/doc/current/validation.html (逃
    rogerchen
        7
    rogerchen  
       2016-12-18 09:01:59 +08:00
    滑稽脸,啥是 OOP 思想
    zachlhb
        8
    zachlhb  
       2016-12-18 09:21:04 +08:00 via Android   2
    你牛逼自己写个,没人逼你用
    holyghost
        9
    holyghost  
       2016-12-18 09:38:26 +08:00
    return true !== $result ? $result : true;

    被这句搞崩溃了
    misaka20038numbe
        10
    misaka20038numbe  
       2016-12-18 09:47:33 +08:00
    @holyghost 这个很容易理解啊,只要 $result 不完全是 true 就返回 $result , 否则返回 true .
    zoues
        11
    zoues  
       2016-12-18 09:50:19 +08:00 via iPhone
    @zachlhb 我发现说 u can u up no can no bb 的是不是..
    forvtwoex
        12
    forvtwoex  
       2016-12-18 09:55:07 +08:00
    LZ 应该收购了 TP ,然后把自己不满意的地方重写一遍。
    realpg
        13
    realpg  
    PRO
       2016-12-18 10:51:02 +08:00
    刚在别的帖子吐槽了一下 thinkphp
    然后就被一个利益关系不明确的喷了一遍说我没看过 thinkphp 5.0
    更加坚定了我以后不给任何简历上提到 thinkphp 的人面试机会的决心

    @misaka20038numbe
    正常人应该是 $result!==true?$result:true 吧
    为了方便阅读习惯,变量放在左边是基本常识吧
    1762628386
        14
    1762628386  
    OP
       2016-12-18 11:06:57 +08:00
    @zachlhb 你还说对了 就是打算自己写个
    jok3r
        15
    jok3r  
       2016-12-18 11:22:06 +08:00 via Android
    @realpg 这种写法的也比较多,主要是防止把==写成=。不过可读性较差,我也不喜欢
    1762628386
        16
    1762628386  
    OP
       2016-12-18 11:23:31 +08:00
    逻辑判断是小事 关键是方法的职责没有分离,一个方法应该是处理逻辑业务可复用的最小颗粒度
    TP 的这个验证方法包含了太多的逻辑处理, 甚至连解析验证规则里面都有,
    一个验证至少是分为这几部分
    1 用户设置
    2 解析用户设置的验证规则
    3 保存验证规则在集合体中
    4 循环对各个字段验证
    5 根据验证规则讲错误信息保存在集合体中 ,返回给用户

    - - ! 这代码真头疼
    wy315700
        17
    wy315700  
       2016-12-18 11:25:31 +08:00
    @realpg 写 true == $result 是为了防止写错
    比如你写 $result == true ,手一抖中间少写个等号,结果就完全不一样了
    c 语言教程里都会提到这个
    Doubear
        18
    Doubear  
       2016-12-18 11:25:33 +08:00
    呵呵,又没人逼你用对吧?那框架我也只是看过一点,后来想想用着不如自己写方便,就没搞了。现在还是投入框架的怀抱,不过是 laravel 。
    1762628386
        19
    1762628386  
    OP
       2016-12-18 11:27:30 +08:00
    @vugusurk 至少 laravel 中不会出现 4 层的 if else 嵌套加循环加字符串处理转数组吧
    yxzblue
        20
    yxzblue  
       2016-12-18 11:28:23 +08:00
    You can you up
    realpg
        21
    realpg  
    PRO
       2016-12-18 11:30:24 +08:00
    @wy315700
    好吧 我从来没想过这个问题
    毕竟我的开发环境会对判断性的地方出现单等号强行报错 即使没错也不让用这种“精巧的”“超级有技巧的”写法
    1762628386
        22
    1762628386  
    OP
       2016-12-18 11:32:25 +08:00
    @yxzblue 至少是个框架啊 给那么多人用的 写的这么渣 还不让人说了 ?
    whahuzhihao
        23
    whahuzhihao  
       2016-12-18 11:34:44 +08:00
    @realpg true 放左边是正确做法,防止少写了等于号变成赋值
    Syc
        24
    Syc  
       2016-12-18 11:42:31 +08:00 via Android
    所谓的基本常识只是个人常识。每个人的代码阅读编写风格不同,而框架开发者则要尽量避开自己的风格,采用最直接最不易出错的代码。

    如楼上所说,这样只是防止少写=导致变量赋值
    Jakesoft
        25
    Jakesoft  
       2016-12-18 11:55:28 +08:00
    @realpg 你是不是基本不看别人代码? true === $result 在 c++等语言中很常见好吧,这个写法还有个专有名词,具体什么我也忘记了。至于阅读困难的问题,如果大家都这么写,过一段时间你就习惯了
    realpg
        26
    realpg  
    PRO
       2016-12-18 11:57:03 +08:00
    @whahuzhihao
    @Syc

    我能看懂 也见过很多 但是从来没考虑过为什么 或者是谁教出来的 之前只是归结成习惯问题了
    反正我自己是不写这种的
    我的开发环境对于允许出现判断的地方出现赋值运算符会直接报错 认为是误写 即使是“用技巧”特意这样写的也不让

    反正我是难以阅读这种代码,我手底下也管理过大量写代码的人 也做 code review ,也有不少从 C/JAVA 过来的,反正是没见过自己这么写的,自己用的代码我看不到,需要给别人看让别人审的代码,都是尽量照顾可读性
    1762628386
        27
    1762628386  
    OP
       2016-12-18 11:59:15 +08:00
    true === $result true ==$result 是对的 就是为了防止我们少写一个' =' 导致变量赋值 触发语句
    holyghost
        28
    holyghost  
       2016-12-18 12:08:02 +08:00
    @misaka20038numbe

    return $result === true;

    你觉得这个好理解么?
    Syc
        29
    Syc  
       2016-12-18 12:08:38 +08:00 via Android
    @realpg 由于 PHP 的过度“开放”所以需要团队开发中常常需要框架来规范。对于框架开发来说,首要考虑的是安全性和可靠性,其次才是阅读性。不一定所有用了框架的开发人都要完整阅读理解框架,只需要快速实际安全的实现业务即可。
    realpg
        30
    realpg  
    PRO
       2016-12-18 12:09:55 +08:00
    @Jakesoft
    确实 从事开发 15 年 从来没看过一行别人写的代码 这样你开心了吧?

    或者我们这帮搞 PHP 的都比较 low 没法跟你们这些没事儿看 C++等语言的真程序员混到一起去

    随手搜了一下现在审阅的 yii2 的代码库 还真有一个 false !== 诶 虽然这个包含个!并不会导致误用







    Jakesoft
        31
    Jakesoft  
       2016-12-18 12:33:09 +08:00
    @realpg 我的言论有点不友好,抱歉。

    如果你是团队组织者,是可以决定该使用哪种写法,毕竟每个团队应该有统一规范。

    PHP 中有使用 true === $result , 我同事也是这么写,我以前也是 写 $result === true,后来发现换个位置其实没什么大不了。

    之所以举 c++的例子是因为我看一些初级 c++教程都是这么写的,这点有装逼悬疑。

    另外我目前也是写 php 。

    ---

    顺手在 symfony 的源码里面搜了一下 `null !==` 有 100+的结果。 psr 规范没有规定应该使用哪种写法,所以一切看团队的建设咯。
    realpg
        32
    realpg  
    PRO
       2016-12-18 12:49:46 +08:00
    @Jakesoft
    我也道歉 说话冲了点
    我也不是没见过 只是真没理解或者说没去探究为啥要这么写 而且写 PHP PYTHON JAVA RUBY 的大量框架什么的都不会这么写

    能运行 那么代码本身就没错

    还有就是标准 PSR 来说 很多东西他规范的我们都故意不去按照这个去做 其实规定只是为了有规定,比如连花括号都规定,对于很多大工程,需要上下回顾引用 变量的变化的情况,我用 1080p 的显示器竖着放都嫌一页代码显示的行数不够照顾以及阅读原作者的意图,就是用自己的习惯当标准的生动代表。大厂在复杂算法下 进行历史代码调错 很多时候

    基本上日常生产,公司的标准以方便别人阅读第一,开发速度第二,同一个文件里的变量命名法不同,其实并不会影响开发效率,也不会影响可读性,顶天是修改时候再打变量费劲


    从日常快速阅读来说,本身人类的判断习惯就是一对多下变量先提。就像我生病了要请病假,给领导打电话,王总我要请病假,我生病了,生病了是状态的一种常量,很少有人说 王总,生病了那个是我我要请病假。

    在此例中,就是防止自己写错和让别人读的快 0.1s 哪个更优先的问题。作为公众代码,我个人倾向于语义优先。

    您提到了 C++,我不开发 C++,略懂一点,上学也学过玩过,我估计是 C++的复杂工程逻辑判断让人欲仙欲死的原因导致的吧
    AbrahamGreyson
        33
    AbrahamGreyson  
       2016-12-18 13:23:27 +08:00 via iPhone
    @wy315700 楼主吐槽的貌似不是变量前置的问题
    AbrahamGreyson
        34
    AbrahamGreyson  
       2016-12-18 13:23:44 +08:00 via iPhone
    @wy315700 标量 发错了
    misaka20038numbe
        35
    misaka20038numbe  
       2016-12-18 13:36:36 +08:00
    @holyghost 这个没什么吧, return function 返回函数执行的结果, return 1==1 返回表达式的结果, return 233 返回常量.反正都是返回一个结果.
    1762628386
        36
    1762628386  
    OP
       2016-12-18 13:37:49 +08:00
    @AbrahamGreyson 对哇 没想到引发了另一个大战 哈哈哈哈哈哈哈哈哈哈哈哈哈
    des
        37
    des  
       2016-12-18 13:44:40 +08:00 via iPhone   3
    @misaka20038numbe
    所以为什么不直接 return $result;呢?
    billwang
        38
    billwang  
       2016-12-18 13:45:04 +08:00
    其实我挺好奇楼主写的代码有多么优秀,不如放上来让大家看看?
    des
        39
    des  
       2016-12-18 13:49:29 +08:00 via iPhone
    @billwang
    所以你的意思是,如果我没写过,就不能评价别人写的烂了咯?
    yidinghe
        40
    yidinghe  
       2016-12-18 14:18:26 +08:00
    @zachlhb 没人逼他吐槽,他不照样吐槽了。
    sagaxu
        41
    sagaxu  
       2016-12-18 14:26:37 +08:00
    @wy315700 ==少写个=,现代编译器和 IDE 都会提示的,根本就不是个事
    vugusurk
        42
    vugusurk  
       2016-12-18 14:34:22 +08:00
    @kancloud 撕逼云快来
    wy315700
        43
    wy315700  
       2016-12-18 14:47:38 +08:00
    @sagaxu
    不是所有人都喜欢用 IDE 的
    chocotan
        44
    chocotan  
       2016-12-18 14:55:20 +08:00   2
    楼主的看法先不说,
    下面回复里的“你行你上”这种逻辑错误的话居然还能从一个程序员的嘴里说出来,真是匪夷所思
    1762628386
        4
    1762628386  
    OP
       2016-12-18 15:00:25 +08:00
    @chocotan 程序员的门槛越来越低了
    minamike
        46
    minamike  
       2016-12-18 15:11:23 +08:00
    程序员有什么门槛
    程序员不就是你行你上么
    看不上人家写的就自己写呗(手动滑稽
    scyuns
        47
    scyuns  
       2016-12-18 15:12:40 +08:00 via Android
    你还小 ,孩子 。
    等你多写个几年你就明白他们为什么那样写了!!
    小时候梦想改变世界的人不是只有你一个。
    但现实却是你必须被世界改变你才能被世界世界认可。
    1762628386
        48
    1762628386  
    OP
       2016-12-18 15:17:31 +08:00
    @scyuns 对方拒绝,并打翻了你这碗毒鸡汤~
    1762628386
        49
    1762628386  
    OP
       2016-12-18 15:18:50 +08:00
    @yxzblue 那你说说为什么他们为什么这样写(手动斜眼)
    congeec
        50
    congeec  
       2016-12-18 15:19:08 +08:00 via iPhone
    @chocotan 感觉是被直呼带坏了
    说话内容的对与错、说话的权利,这两者的区别不知道大家看不看得见。
    1762628386
        51
    1762628386  
    OP
       2016-12-18 15:32:30 +08:00
    @scyuns 是不是因为他们看清了这个世界,顺便叹了口气:唉 社会就是这样 (手动滑稽)
    quericy
        52
    quericy  
       2016-12-18 17:13:34 +08:00   2
    @holyghost @misaka20038numbe @realpg
    怎么都在吐槽 true 放左边....问题不应该是:
    return true !== $result ? $result : true;

    return $result;
    有毛区别....
    mokeyjay
        53
    mokeyjay  
       2016-12-18 17:31:05 +08:00
    等等,这楼貌似刚开始就歪了啊…… LZ 表示没人理他他很伤心啊
    说回来,要说规范和优雅,可以去看 Laravel 啊,不过就是性能……
    要是觉得 TP 不好可以吐槽,如果希望它变好可以 PR
    毕竟程序猿的本质就是“你行你上”,世界就是因为这个准则而越来越美好
    1762628386
        54
    1762628386  
    OP
       2016-12-18 17:34:29 +08:00
    @mokeyjay 呀 终于有点存在感了
    holyghost
        55
    holyghost  
       2016-12-18 17:55:42 +08:00
    @quericy 我也不知道,好像他们还不知道有个东西叫 IDE ?少写一个=又能怎么样。。。
    xcodebuild
        56
    xcodebuild  
       2016-12-18 19:32:18 +08:00
    @des
    @chocotan
    个人观点:作为品尝饭菜的人当然可以说厨师烧得不好吃(即使你不会烧菜),但是如果同为厨师,烧不出更好的菜去喷别的厨师烧得不好吃就不太好了。
    21grams
        57
    21grams  
       2016-12-18 19:35:16 +08:00
    写出来就行,怎么写是次要的。
    Syc
        58
    Syc  
       2016-12-18 19:35:30 +08:00 via Android
    @sagaxu 我从不用 IDE ……简简单单的 Vim 多好
    fthvgb1
        59
    fthvgb1  
       2016-12-18 19:47:32 +08:00
    return true !== $result ? $result : true;
    fthvgb1
        60
    fthvgb1  
       2016-12-18 19:49:06 +08:00
    这个判断有意义么,横竖都返回 true
    yxzblue
        61
    yxzblue  
       2016-12-18 20:12:39 +08:00
    @1762628386 哥们你应该去看了 TP5 以前的版本,那会被你喷成狗一样。我只是让你省省口水,多做点实事。 You can you up...
    chenyachao
        62
    chenyachao  
       2016-12-18 20:42:24 +08:00
    虽然我没用过 tp ,也不打算用,但是觉得吐槽一个维护了很多年的东西还是给点包容比较好~
    williamx
        63
    williamx  
       2016-12-18 20:46:36 +08:00
    当时选型的时候优先考虑过 TP , 想毕竟是国内的产品,文档等方面会比较顺畅,但是看了网站和代码,感觉扑面的一股浓浓的山寨风,不得已放弃了。
    jok3r
        64
    jok3r  
       2016-12-18 20:51:04 +08:00 via Android
    @fthvgb1 再读一遍
    liuxu
        65
    liuxu  
       2016-12-18 21:07:36 +08:00 via Android
    @Syc 楼下 emacs 用户不服
    keysona
        66
    keysona  
       2016-12-18 21:26:25 +08:00
    。。。这种时候不是要 fork ,改了之后 pr 吗?

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

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

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

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

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

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

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

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

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


    ---

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

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

    用过 tp 的不招,培训班毕业的不招,这都是经验总结,无数坑爹经历换来的。
    xuhaoyangx
        80
    xuhaoyangx  
       2016-12-19 09:37:46 +08:00
    @sagaxu php 方面就只用过 tp\laravel 岂不是上黑名单了
    EchoUtopia
        81
    EchoUtopia  
       2016-12-19 09:37:55 +08:00
    连基本的排版都做不好,也好意思出来喷
    sagaxu
        82
    sagaxu  
       2016-12-19 09:48:29 +08:00 via Android
    @xuhaoyangx 用过可以不说,也可以吐槽一下,不然只能作为减分项了,要靠其它方面扳回来
    TIGERB
        83
    TIGERB  
       2016-12-19 09:52:41 +08:00
    淡定,哈哈
    windowsma
        84
    windowsma  
       2016-12-19 10:12:24 +08:00
    @realpg 不用这么偏激吧。。我的启蒙框架
    realpg
        85
    realpg  
    PRO
       2016-12-19 10:14:51 +08:00
    @windowsma
    已经执行多年这个政策了,误伤率极低,或者说根本没有。,
    Nicksxs
        86
    Nicksxs  
       2016-12-19 11:09:59 +08:00
    既然觉得这段代码不好,说 TP 不懂 OOP ,那么你就把它改成你觉得好的, OOP 的,然后贴出来,让大家评价下,不然作为一个码农只是光喷没啥意思, show me your code
    jy04149886
        87
    jy04149886  
       2016-12-19 11:20:52 +08:00
    支持楼主
    dsphper
        88
    dsphper  
       2016-12-19 11:38:29 +08:00
    @realpg 大哥谁告诉你变量放在左边是常识?
    举个==的例子:
    ```php
    if($result == true) { // 正确写法

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

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

    }
    ```
    tabris17
        89
    tabris17  
       2016-12-19 11:42:18 +08:00
    一根面条嗦到底,多爽气的代码呀
    dsphper
        90
    dsphper  
       2016-12-19 11:44:52 +08:00
    ThinkPHP ,代码质量确实参差不齐。这个框架的设计思想,我也是醉了。只考虑眼前用着爽,后期呵呵、。
    Syc
        91
    Syc  
       2016-12-19 12:40:25 +08:00 via Android
    @keysona 这个问题貌似有人通过修改 php 的源代码后自行编译解决。把$改成啥看你自己咯。
    blackjar
        92
    blackjar  
       2016-12-19 14:29:59 +08:00
    自己 low 别说成搞 php 的 low
    kancloud
        93
    kancloud  
       2016-12-19 14:49:28 +08:00
    我真是服了 V2 的讨论氛围 有问题和建议直接去 github 提交 PR 不就行了 不能指望什么东西都是完美的,众人拾柴火焰高不是开源的本质么?正是有用户不断的参与贡献以及建议,才有了今天的 TP5 ,然后随着分工和多用户的提交,必然也会产生一些不完美的代码实现,但起码会保证单元测试 OK 以及没 BUG 这是大前提,规范问题,官方都是遵循 PSR-2 和 PSR-4 规范的,那些说着说那的用户 你们真正运营过一个国内的开源项目么?
    run2
        94
    run2  
       2016-12-19 15:13:10 +08:00
    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
        95
    hanzhao  
       2016-12-19 15:54:55 +08:00
    ![]( http://p1.bqimg.com/567571/a834f54527d55520.png)
    这是 Laravel5.1 也有不少这种写法啊。

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

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

    与其用这种奇怪的 hack ,还不如配置一下 IDE ,报一下 if 里的赋值呢。
    而且,熟手有多少人判断等于的时候会漏写一个等号。都成条件反射了。
    1  2  
    关于     帮助档     自助推广系统     博客     API     FAQ     Solana     821 人在线   最高记录 6679       Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 31ms UTC 21:29 PVG 05:29 LAX 13:29 JFK 16:29
    Do have faith in what you're doing.
    ubao msn snddm index pchome yahoo rakuten mypaper meadowduck bidyahoo youbao zxmzxm asda bnvcg cvbfg dfscv mmhjk xxddc yybgb zznbn ccubao uaitu acv GXCV ET GDG YH FG BCVB FJFH CBRE CBC GDG ET54 WRWR RWER WREW WRWER RWER SDG EW SF DSFSF fbbs ubao fhd dfg ewr dg df ewwr ewwr et ruyut utut dfg fgd gdfgt etg dfgt dfgd ert4 gd fgg wr 235 wer3 we vsdf sdf gdf ert xcv sdf rwer hfd dfg cvb rwf afb dfh jgh bmn lgh rty gfds cxv xcv xcs vdas fdf fgd cv sdf tert sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf sdf shasha9178 shasha9178 shasha9178 shasha9178 shasha9178 liflif2 liflif2 liflif2 liflif2 liflif2 liblib3 liblib3 liblib3 liblib3 liblib3 zhazha444 zhazha444 zhazha444 zhazha444 zhazha444 dende5 dende denden denden2 denden21 fenfen9 fenf619 fen619 fenfe9 fe619 sdf sdf sdf sdf sdf zhazh90 zhazh0 zhaa50 zha90 zh590 zho zhoz zhozh zhozho zhozho2 lislis lls95 lili95 lils5 liss9 sdf0ty987 sdft876 sdft9876 sdf09876 sd0t9876 sdf0ty98 sdf0976 sdf0ty986 sdf0ty96 sdf0t76 sdf0876 df0ty98 sf0t876 sd0ty76 sdy76 sdf76 sdf0t76 sdf0ty9 sdf0ty98 sdf0ty987 sdf0ty98 sdf6676 sdf876 sd876 sd876 sdf6 sdf6 sdf9876 sdf0t sdf06 sdf0ty9776 sdf0ty9776 sdf0ty76 sdf8876 sdf0t sd6 sdf06 s688876 sd688 sdf86