/** * 验证单个字段规则 * @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
1762628386 OP ```
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; } ``` |
2
1762628386 OP 本来打算重写 tp 的验证放自己的项目上用 一看这代码完全就是单纯为了实现[验证]这个功能,根本没法复用, 貌似连个最基本的后期静态绑定都没有啊
|
3
hronro 2016-12-18 02:07:24 +08:00
这个排版,我也受不了
|
4
orderc 2016-12-18 08:24:58 +08:00
论代码可读性的重要
|
5
vugusurk 2016-12-18 08:52:44 +08:00
日常黑 ThinkPHP
瞅瞅这个? https://github.com/illuminate/validation |
6
vugusurk 2016-12-18 08:55:16 +08:00
哦,不对,是这个: https://symfony.com/doc/current/validation.html (逃
|
7
rogerchen 2016-12-18 09:01:59 +08:00
滑稽脸,啥是 OOP 思想
|
8
zachlhb 2016-12-18 09:21:04 +08:00 via Android 2
你牛逼自己写个,没人逼你用
|
9
holyghost 2016-12-18 09:38:26 +08:00
return true !== $result ? $result : true;
被这句搞崩溃了 |
10
misaka20038numbe 2016-12-18 09:47:33 +08:00
@holyghost 这个很容易理解啊,只要 $result 不完全是 true 就返回 $result , 否则返回 true .
|
12
forvtwoex 2016-12-18 09:55:07 +08:00
LZ 应该收购了 TP ,然后把自己不满意的地方重写一遍。
|
13
realpg 2016-12-18 10:51:02 +08:00
刚在别的帖子吐槽了一下 thinkphp
然后就被一个利益关系不明确的喷了一遍说我没看过 thinkphp 5.0 更加坚定了我以后不给任何简历上提到 thinkphp 的人面试机会的决心 @misaka20038numbe 正常人应该是 $result!==true?$result:true 吧 为了方便阅读习惯,变量放在左边是基本常识吧 |
14
1762628386 OP @zachlhb 你还说对了 就是打算自己写个
|
16
1762628386 OP 逻辑判断是小事 关键是方法的职责没有分离,一个方法应该是处理逻辑业务可复用的最小颗粒度
TP 的这个验证方法包含了太多的逻辑处理, 甚至连解析验证规则里面都有, 一个验证至少是分为这几部分 1 用户设置 2 解析用户设置的验证规则 3 保存验证规则在集合体中 4 循环对各个字段验证 5 根据验证规则讲错误信息保存在集合体中 ,返回给用户 - - ! 这代码真头疼 |
17
wy315700 2016-12-18 11:25:31 +08:00
|
18
Doubear 2016-12-18 11:25:33 +08:00
呵呵,又没人逼你用对吧?那框架我也只是看过一点,后来想想用着不如自己写方便,就没搞了。现在还是投入框架的怀抱,不过是 laravel 。
|
19
1762628386 OP @vugusurk 至少 laravel 中不会出现 4 层的 if else 嵌套加循环加字符串处理转数组吧
|
20
yxzblue 2016-12-18 11:28:23 +08:00
You can you up
|
21
realpg 2016-12-18 11:30:24 +08:00
|
22
1762628386 OP @yxzblue 至少是个框架啊 给那么多人用的 写的这么渣 还不让人说了 ?
|
23
whahuzhihao 2016-12-18 11:34:44 +08:00
@realpg true 放左边是正确做法,防止少写了等于号变成赋值
|
24
Syc 2016-12-18 11:42:31 +08:00 via Android
所谓的基本常识只是个人常识。每个人的代码阅读编写风格不同,而框架开发者则要尽量避开自己的风格,采用最直接最不易出错的代码。
如楼上所说,这样只是防止少写=导致变量赋值 |
25
Jakesoft 2016-12-18 11:55:28 +08:00
@realpg 你是不是基本不看别人代码? true === $result 在 c++等语言中很常见好吧,这个写法还有个专有名词,具体什么我也忘记了。至于阅读困难的问题,如果大家都这么写,过一段时间你就习惯了
|
26
realpg 2016-12-18 11:57:03 +08:00
@whahuzhihao
@Syc 我能看懂 也见过很多 但是从来没考虑过为什么 或者是谁教出来的 之前只是归结成习惯问题了 反正我自己是不写这种的 我的开发环境对于允许出现判断的地方出现赋值运算符会直接报错 认为是误写 即使是“用技巧”特意这样写的也不让 反正我是难以阅读这种代码,我手底下也管理过大量写代码的人 也做 code review ,也有不少从 C/JAVA 过来的,反正是没见过自己这么写的,自己用的代码我看不到,需要给别人看让别人审的代码,都是尽量照顾可读性 |
27
1762628386 OP true === $result true ==$result 是对的 就是为了防止我们少写一个' =' 导致变量赋值 触发语句
|
28
holyghost 2016-12-18 12:08:02 +08:00
|
29
Syc 2016-12-18 12:08:38 +08:00 via Android
@realpg 由于 PHP 的过度“开放”所以需要团队开发中常常需要框架来规范。对于框架开发来说,首要考虑的是安全性和可靠性,其次才是阅读性。不一定所有用了框架的开发人都要完整阅读理解框架,只需要快速实际安全的实现业务即可。
|
30
realpg 2016-12-18 12:09:55 +08:00
@Jakesoft
确实 从事开发 15 年 从来没看过一行别人写的代码 这样你开心了吧? 或者我们这帮搞 PHP 的都比较 low 没法跟你们这些没事儿看 C++等语言的真程序员混到一起去 随手搜了一下现在审阅的 yii2 的代码库 还真有一个 false !== 诶 虽然这个包含个!并不会导致误用 |
31
Jakesoft 2016-12-18 12:33:09 +08:00
@realpg 我的言论有点不友好,抱歉。
如果你是团队组织者,是可以决定该使用哪种写法,毕竟每个团队应该有统一规范。 PHP 中有使用 true === $result , 我同事也是这么写,我以前也是 写 $result === true,后来发现换个位置其实没什么大不了。 之所以举 c++的例子是因为我看一些初级 c++教程都是这么写的,这点有装逼悬疑。 另外我目前也是写 php 。 --- 顺手在 symfony 的源码里面搜了一下 `null !==` 有 100+的结果。 psr 规范没有规定应该使用哪种写法,所以一切看团队的建设咯。 |
32
realpg 2016-12-18 12:49:46 +08:00
@Jakesoft
我也道歉 说话冲了点 我也不是没见过 只是真没理解或者说没去探究为啥要这么写 而且写 PHP PYTHON JAVA RUBY 的大量框架什么的都不会这么写 能运行 那么代码本身就没错 还有就是标准 PSR 来说 很多东西他规范的我们都故意不去按照这个去做 其实规定只是为了有规定,比如连花括号都规定,对于很多大工程,需要上下回顾引用 变量的变化的情况,我用 1080p 的显示器竖着放都嫌一页代码显示的行数不够照顾以及阅读原作者的意图,就是用自己的习惯当标准的生动代表。大厂在复杂算法下 进行历史代码调错 很多时候 基本上日常生产,公司的标准以方便别人阅读第一,开发速度第二,同一个文件里的变量命名法不同,其实并不会影响开发效率,也不会影响可读性,顶天是修改时候再打变量费劲 从日常快速阅读来说,本身人类的判断习惯就是一对多下变量先提。就像我生病了要请病假,给领导打电话,王总我要请病假,我生病了,生病了是状态的一种常量,很少有人说 王总,生病了那个是我我要请病假。 在此例中,就是防止自己写错和让别人读的快 0.1s 哪个更优先的问题。作为公众代码,我个人倾向于语义优先。 您提到了 C++,我不开发 C++,略懂一点,上学也学过玩过,我估计是 C++的复杂工程逻辑判断让人欲仙欲死的原因导致的吧 |
33
AbrahamGreyson 2016-12-18 13:23:27 +08:00 via iPhone
@wy315700 楼主吐槽的貌似不是变量前置的问题
|
34
AbrahamGreyson 2016-12-18 13:23:44 +08:00 via iPhone
@wy315700 标量 发错了
|
35
misaka20038numbe 2016-12-18 13:36:36 +08:00
@holyghost 这个没什么吧, return function 返回函数执行的结果, return 1==1 返回表达式的结果, return 233 返回常量.反正都是返回一个结果.
|
36
1762628386 OP @AbrahamGreyson 对哇 没想到引发了另一个大战 哈哈哈哈哈哈哈哈哈哈哈哈哈
|
37
des 2016-12-18 13:44:40 +08:00 via iPhone 3
@misaka20038numbe
所以为什么不直接 return $result;呢? |
38
billwang 2016-12-18 13:45:04 +08:00
其实我挺好奇楼主写的代码有多么优秀,不如放上来让大家看看?
|
44
chocotan 2016-12-18 14:55:20 +08:00 2
楼主的看法先不说,
下面回复里的“你行你上”这种逻辑错误的话居然还能从一个程序员的嘴里说出来,真是匪夷所思 |
45
1762628386 OP @chocotan 程序员的门槛越来越低了
|
46
minamike 2016-12-18 15:11:23 +08:00
程序员有什么门槛
程序员不就是你行你上么 看不上人家写的就自己写呗(手动滑稽 |
47
scyuns 2016-12-18 15:12:40 +08:00 via Android
你还小 ,孩子 。
等你多写个几年你就明白他们为什么那样写了!! 小时候梦想改变世界的人不是只有你一个。 但现实却是你必须被世界改变你才能被世界世界认可。 |
48
1762628386 OP @scyuns 对方拒绝,并打翻了你这碗毒鸡汤~
|
49
1762628386 OP @yxzblue 那你说说为什么他们为什么这样写(手动斜眼)
|
50
congeec 2016-12-18 15:19:08 +08:00 via iPhone
@chocotan 感觉是被直呼带坏了
说话内容的对与错、说话的权利,这两者的区别不知道大家看不看得见。 |
51
1762628386 OP @scyuns 是不是因为他们看清了这个世界,顺便叹了口气:唉 社会就是这样 (手动滑稽)
|
52
quericy 2016-12-18 17:13:34 +08:00 2
@holyghost @misaka20038numbe @realpg
怎么都在吐槽 true 放左边....问题不应该是: return true !== $result ? $result : true; 和 return $result; 有毛区别.... |
53
mokeyjay 2016-12-18 17:31:05 +08:00
等等,这楼貌似刚开始就歪了啊…… LZ 表示没人理他他很伤心啊
说回来,要说规范和优雅,可以去看 Laravel 啊,不过就是性能…… 要是觉得 TP 不好可以吐槽,如果希望它变好可以 PR 毕竟程序猿的本质就是“你行你上”,世界就是因为这个准则而越来越美好 |
54
1762628386 OP @mokeyjay 呀 终于有点存在感了
|
56
xcodebuild 2016-12-18 19:32:18 +08:00
|
57
21grams 2016-12-18 19:35:16 +08:00
写出来就行,怎么写是次要的。
|
59
fthvgb1 2016-12-18 19:47:32 +08:00
return true !== $result ? $result : true;
|
60
fthvgb1 2016-12-18 19:49:06 +08:00
这个判断有意义么,横竖都返回 true
|
61
yxzblue 2016-12-18 20:12:39 +08:00
@1762628386 哥们你应该去看了 TP5 以前的版本,那会被你喷成狗一样。我只是让你省省口水,多做点实事。 You can you up...
|
62
chenyachao 2016-12-18 20:42:24 +08:00
虽然我没用过 tp ,也不打算用,但是觉得吐槽一个维护了很多年的东西还是给点包容比较好~
|
63
williamx 2016-12-18 20:46:36 +08:00
当时选型的时候优先考虑过 TP , 想毕竟是国内的产品,文档等方面会比较顺畅,但是看了网站和代码,感觉扑面的一股浓浓的山寨风,不得已放弃了。
|
66
keysona 2016-12-18 21:26:25 +08:00
。。。这种时候不是要 fork ,改了之后 pr 吗?
看了下,这个应该是开源的吧? 我开始写代码也是不考虑什么 oop 之类的,先把功能做出来,之后重构的。 |
67
keysona 2016-12-18 21:29:08 +08:00
话说,到现在还是接受不了 php 的$。。。
个人觉得,不符合美感... 个人感受,求不喷... |
69
lamCJ 2016-12-18 22:38:15 +08:00
TP 能用 站在使用的角度并没多大影响 但是个人认为不优雅(个人认为) 可读性差 多层嵌套很普遍 能把你看晕
记得当时有团队成员在操作 session 时遇到点问题 想看看 TP 怎么写的 直到我看到了那个 `session()` 方法 ... 后来我强制性让他们舍弃了 TP 并把可读性当作是团队开发第一原则 我带领大家熟悉 Laravel 目前为止都写的很爽 更重要的是他们跟着也学到了很多 Modern PHP 的东西 这是他们用 TP 时没有学到的 |
70
zi 2016-12-18 23:09:44 +08:00
我真的想知道,为什么 "return true !== $result ? $result : true;" 不写成 "return $result;" ?
|
71
sagaxu 2016-12-18 23:10:31 +08:00
@wy315700 编译型语言,编译器会提示,不用 IDE 总要用编译器吧。脚本也有各种代码质量检查工具。更可笑的是,我竟然看到有人在 java 里也这么写,漏掉一个=直接语法错误,编译都编不过去的,倒过来写纯属蛋疼。
|
72
xuhaoyangx 2016-12-19 00:05:13 +08:00
我只能说,你觉得你可以,就请自己写一个维护。
既然你要用它,那有什么好喷的? 大厂中的代码不乏这样的,有什么会打死的,只要功能能实现,且快,无安全问题,为何不行? 曾在某 xx 宝 交易系统的 外包公司做过,中间件用 c++写,前端数据交互用 java ,你不知道那个才就做丑,水平参差不齐的,但别人实现了功能,性能能支持股市级别的负载量,这些代码你又能说什么呢。 顺便说 true !== $result 这玩意,以前有人对咱说过,是避免 if 下写错了,而的形成习惯 @sagaxu if while 等,编译型语言能通过 |
73
liuzhanpeng 2016-12-19 08:18:59 +08:00
5.0 已经有所改善了,不信你看看 3.x 版本
|
75
kancloud 2016-12-19 08:45:22 +08:00
你喜欢一个框架自然会有喜欢的理由 你讨厌一个框架自然也会有讨厌的理由,这个道理放到任何框架都成立!
|
76
Jakesoft 2016-12-19 08:50:38 +08:00 via iPhone
@quericy 本来不想再回这个帖子的…如果我有什么不对可随意吐槽
因为 PHP 动态语言的关系,$result 可能是个数组,比如这里,这个验证可能没通过,于是返回错误的信息,都放在这个数组里,如果判断 result 强等于 true 说明验证通过,如果不是,说明没通过,并返回错误信息的数组 --- 我也不是很喜欢这种“两个标准”的写法,一般 return 都会返回具体类型或者 null |
77
zooandzoo 2016-12-19 09:14:19 +08:00
你可以自己写一个框架,然后用它做做项目,回头看看比 TP 差很远,不要眼高手低。
|
78
misaka19000 2016-12-19 09:18:02 +08:00 via Android
开源本来不就是你不行我来上吗?期待楼主的 PHP 框架~~
|
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 的不招,培训班毕业的不招,这都是经验总结,无数坑爹经历换来的。 |
80
xuhaoyangx 2016-12-19 09:37:46 +08:00
@sagaxu php 方面就只用过 tp\laravel 岂不是上黑名单了
|
81
EchoUtopia 2016-12-19 09:37:55 +08:00
连基本的排版都做不好,也好意思出来喷
|
82
sagaxu 2016-12-19 09:48:29 +08:00 via Android
@xuhaoyangx 用过可以不说,也可以吐槽一下,不然只能作为减分项了,要靠其它方面扳回来
|
83
TIGERB 2016-12-19 09:52:41 +08:00
淡定,哈哈
|
86
Nicksxs 2016-12-19 11:09:59 +08:00
既然觉得这段代码不好,说 TP 不懂 OOP ,那么你就把它改成你觉得好的, OOP 的,然后贴出来,让大家评价下,不然作为一个码农只是光喷没啥意思, show me your code
|
87
jy04149886 2016-12-19 11:20:52 +08:00
支持楼主
|
88
dsphper 2016-12-19 11:38:29 +08:00
@realpg 大哥谁告诉你变量放在左边是常识?
举个==的例子: ```php if($result == true) { // 正确写法 } if($result = true) { // 手抖的错误写法,很多时候新手可能会犯这种错误。 } if(true = $result) { // 这样解析器会直接抛出错误,就算少写了一个=号也不必担心出现永远等于 true 的问题,避免了不必要的寻错成本。 } ``` |
89
tabris17 2016-12-19 11:42:18 +08:00
一根面条嗦到底,多爽气的代码呀
|
90
dsphper 2016-12-19 11:44:52 +08:00
ThinkPHP ,代码质量确实参差不齐。这个框架的设计思想,我也是醉了。只考虑眼前用着爽,后期呵呵、。
|
92
blackjar 2016-12-19 14:29:59 +08:00
自己 low 别说成搞 php 的 low
|
93
kancloud 2016-12-19 14:49:28 +08:00
我真是服了 V2 的讨论氛围 有问题和建议直接去 github 提交 PR 不就行了 不能指望什么东西都是完美的,众人拾柴火焰高不是开源的本质么?正是有用户不断的参与贡献以及建议,才有了今天的 TP5 ,然后随着分工和多用户的提交,必然也会产生一些不完美的代码实现,但起码会保证单元测试 OK 以及没 BUG 这是大前提,规范问题,官方都是遵循 PSR-2 和 PSR-4 规范的,那些说着说那的用户 你们真正运营过一个国内的开源项目么?
|
94
sobigfish 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 让人变的更懒了,遇到这些对比时不就是该小心谨慎的写判断么, 所以个人认为是没有必要的,而且不该提倡的 |
95
hanzhao 2016-12-19 15:54:55 +08:00
![]( http://p1.bqimg.com/567571/a834f54527d55520.png)
这是 Laravel5.1 也有不少这种写法啊。 至于纠结 return 这儿的,多读几次,这可不是始终返回 True 还是那句话,这是一个开源 PHP 框架,觉得代码不好,你可以帮助改善,或者置之不理也行,偏在这儿搞个大新闻... |
96
des 2016-12-19 19:51:22 +08:00
@Jakesoft 实在不太懂你怎么想的,不管这里$result 等于什么,返回的都是$result ,而且没有其他逻辑,所以有什么意义呢?
|
97
1762628386 OP 我天 $result 变量没毛病啊,关注点不应该是这一大坨缠绕在一起的代码么
|
98
jhdxr 2016-12-20 02:30:31 +08:00
@Jakesoft 感觉你的点可能有一点偏差,`return true !== $result ? $result : true; `和`return $result;`不应该是完全等价的吗?写成后者的写法并不影响你说的返回 true/array 的情况?
|
99
jhdxr 2016-12-20 02:31:36 +08:00
@1762628386 相比缠在一起的代码,你的排版(我知道你不是故意的,没在 V2EX 上发过几次代码的人都会掉坑里)让人完全没有去看代码的欲望。。。
|