给 phper 出一道基本的面试题, 做错了得加强基础了/

2017-03-23 16:11:43 +08:00
 qwe3364925
请输出该结果
echo '6+5' . 9+7;
7716 次点击
所在节点    PHP
74 条回复
bianhua
2017-03-24 14:12:07 +08:00
@realpg
@allenhu

我的意思是,对 字符串 => Integer 转换进行这样设计,会造成很多问题。

如果能让无法转换成目标类型的值在转换时返回 Mismatch 之类就好了,就算退一步来说也可以丢出异常让程序停止运行。

而 PHP 现在的处理方式是将问题压制下去,自己尝试解析字符串给出一个结果。但是它解析出的结果在很多时候都不是合理的。

'6+5' . (9+7) 是能单单解决这一个问题没错,但是原因只是因为“.”运算符将后面那个 integer 转换成了 string 然后才与字符串'6+5'进行了拼接而已。但是缺陷仍然存在:每次你尝试将一个 string 转换成 integer/float 的时候都冒着风险。
allenhu
2017-03-24 15:20:05 +08:00
#bash> php -r "echo '6+5' . 9+7;"
PHP Notice: A non well formed numeric value encountered in Command line code on line 1
PHP Stack trace:
PHP 1. {main}() Command line code:0

Notice: A non well formed numeric value encountered in Command line code on line 1

Call Stack:
0.0001 352568 1. {main}() Command line code:0

13

如果你说你关了报错,我无话可说
TIGERB
2017-03-24 15:21:32 +08:00
@qdpoboy 第二步错了哈,哈哈,求详解
qdpoboy
2017-03-24 15:32:36 +08:00
@TIGERB 我是说我自己走错了第二步,并非说你…哈哈哈
Chwaiz
2017-03-24 15:41:34 +08:00
Parse error: parse error, expecting `','' or `';''
TIGERB
2017-03-24 19:41:18 +08:00
@qdpoboy 哈哈
jhdxr
2017-03-24 22:43:22 +08:00
@bianhua 有 notice 级别的提醒的。没说程序员只看 error 别的不管,你看例如 laravel 的项目默认就是哪怕 notice 级别的信息也不能忽略
mingyun
2017-03-25 10:22:02 +08:00
@TIGERB 厉害了,哥
bianhua
2017-03-25 11:30:12 +08:00
@allenhu (假定你是回复我的) @jhdxr

首先,其实,我说的是哪怕 echo intval('6+5' . 9) + 7;的情况。

另外,奇怪:
[nick@localhost]~% php -r "phpinfo();" | grep "Loaded Configuration"
Loaded Configuration File => /etc/php.ini
[nick@localhost]~% cat /etc/php.ini | grep "error_reporting =\|display_errors ="
error_reporting = E_ALL
display_errors = On
[nick@localhost]~% php -r "phpinfo();" | grep "error_reporting\|display_errors"
display_errors => STDOUT => STDOUT
error_reporting => 32767 => 32767
[nick@localhost]~% php -r "echo E_ALL;"
32767%

// 让 PHP 报告 Notice
[nick@localhost]~% php -r 'echo $a;'
PHP Notice: Undefined variable: a in Command line code on line 1

Notice: Undefined variable: a in Command line code on line 1

// 没有报告 Notice
[nick@localhost]~% php -r "echo '6+5' . 9 + 7;"
13%

[nick@localhost]~% php -v
PHP 7.0.17 (cli) (built: Mar 15 2017 07:25:27) ( NTS )
Copyright (c) 1997-2017 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2017 Zend Technologies
bianhua
2017-03-25 11:57:30 +08:00
@jhdxr
@allenhu

我发现了,这是 7.1 修正的内容:
https://secure.php.net/ChangeLog-7.php

> Version 7.1.0
> .....
> Number operators taking numeric strings now emit E_NOTICEs or E_WARNINGs when given malformed numeric strings.

们那么貌似就是在说正在做我所希望的那些变更。

另外我搜索了一下 "A non well formed numeric value encountered" 这段字符串。发现很多的项目中招了,所以你看,楼主的问题可能并不是完全没有启发作用?
zhidian
2017-03-25 14:11:07 +08:00
“比如例子里的 ((int)'6+1') == intval('6+1') == 6 。从其他语言的角度上来看完全属于设计不合理,因为会导致混乱。 ” 其实这不属于设计不合理。这是人类的认知 bug 。举例: 红色的“蓝色”,和蓝色的“红色”,问你这是什么颜色, php 说前者是蓝色,后者是红色,完全没有错啊!人之所以被误导,因为你自己过多解读了。而且从实现难度上, php 那种 string 解析为 int 的方式更简单, c 不也是这样吗? php 错在不同类型还可以用加法。这一点上, Java 做得最好。
jhdxr
2017-03-25 15:39:36 +08:00
@zhidian java 里数字之间可以相加,字符串之间可以相加(字符串连接),字符串数字之间也可以相加(同样也是字符串连接); php 至少把数字相加和字符串连接区分开来了。
zhidian
2017-03-25 17:44:30 +08:00
@jhdxr Sorry ,试了下 Java 确实可以。
zhyoulun
2017-03-26 22:36:32 +08:00
这种问题。。唉。。捂脸

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

https://tanronggui.xyz/t/349774

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

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

© 2021 V2EX