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

2016-12-18 01:07:25 +08:00
 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; }

12282 次点击
所在节点    PHP
115 条回复
realpg
2016-12-18 11:30:24 +08:00
@wy315700
好吧 我从来没想过这个问题
毕竟我的开发环境会对判断性的地方出现单等号强行报错 即使没错也不让用这种“精巧的”“超级有技巧的”写法
1762628386
2016-12-18 11:32:25 +08:00
@yxzblue 至少是个框架啊 给那么多人用的 写的这么渣 还不让人说了 ?
whahuzhihao
2016-12-18 11:34:44 +08:00
@realpg true 放左边是正确做法,防止少写了等于号变成赋值
Syc
2016-12-18 11:42:31 +08:00
所谓的基本常识只是个人常识。每个人的代码阅读编写风格不同,而框架开发者则要尽量避开自己的风格,采用最直接最不易出错的代码。

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

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

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

return $result === true;

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

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

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







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

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

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

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

另外我目前也是写 php 。

---

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

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

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

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


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

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

您提到了 C++,我不开发 C++,略懂一点,上学也学过玩过,我估计是 C++的复杂工程逻辑判断让人欲仙欲死的原因导致的吧
AbrahamGreyson
2016-12-18 13:23:27 +08:00
@wy315700 楼主吐槽的貌似不是变量前置的问题
AbrahamGreyson
2016-12-18 13:23:44 +08:00
@wy315700 标量 发错了
misaka20038numbe
2016-12-18 13:36:36 +08:00
@holyghost 这个没什么吧, return function 返回函数执行的结果, return 1==1 返回表达式的结果, return 233 返回常量.反正都是返回一个结果.
1762628386
2016-12-18 13:37:49 +08:00
@AbrahamGreyson 对哇 没想到引发了另一个大战 哈哈哈哈哈哈哈哈哈哈哈哈哈
des
2016-12-18 13:44:40 +08:00
@misaka20038numbe
所以为什么不直接 return $result;呢?
billwang
2016-12-18 13:45:04 +08:00
其实我挺好奇楼主写的代码有多么优秀,不如放上来让大家看看?
des
2016-12-18 13:49:29 +08:00
@billwang
所以你的意思是,如果我没写过,就不能评价别人写的烂了咯?
yidinghe
2016-12-18 14:18:26 +08:00
@zachlhb 没人逼他吐槽,他不照样吐槽了。

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

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

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

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

© 2021 V2EX