我转向PHP后感觉到了一些不同,这里的PHP有点奇怪
對於多數使用PHP的人來說,這是基本的內容,可能不會引起太大的關注。
但對於一般只懂得Java的應用程式工程師來說,變數相關的討論可能显得令人感到不舒服。
背景
我因为一些意外的原因开始学习PHP。
平常我从事应用开发工作,主要使用Java和Swift,偶尔用Kotlin。
对于这些情况,我会按照以下方式进行变量声明。
String string = "string";
var string = "string"
所以,我一直以为在PHP中的赋值操作会像Swift一样进行类型推断。
$int = 1;
$int = "string";
第一,当听到“那种事情竟会变得通用”,感觉非常恶心。
$test = $test === false ? "success" : -1
而且,你究竟是布尔型的、字符串型的,还是整数型的,让人不禁想问你到底是什么类型的,能够写出那样一句话来。
然而,这一次不是在那个地方,而是在搜索关于in_array函数的过程中,我发现PHP的in_array函数有很多陷阱,需要注意和警惕。我读到了一篇关于这一问题的警示文章,感觉很不舒服,这让我想到了对比的话题。
這個問題
只有以下最后一句话不会执行print(“true”)。
if ( 0 == 0 ){ print("true"); } //当たり前
if ( 0 == 0.0 ){ print("true"); } //普通
if ( 0 == "0" ){ print("true"); } //まだ、わかる
if ( 0 == "0.0" ){ print("true"); } //まだ、わかる
if ( 0 == false ){ print("true"); } //わからないでもない
if ( 0 == null ){ print("true"); } //んー、まぁ
if ( 0 == "string" ){ print("true"); } //は?
if ( "string" == 0 ){ print("true"); } //は?
if ( 1 + "string" == 1 ){ print("true"); } //は?
if ( "1" + "string" == 1 ){ print("true"); }//は?
if ( " 01 string" == 1 ){ print("true"); } //これは通るが
if ( " 0 1 string" == 1 ){ print("false"); }//これは通らない
可以举出的理由是,就像PHP手册中关于字符串转换为数字的部分所述。
当将字符串作为数值进行评估时,结果的值和类型如下所定义:
如果字符串中不包含’.’、’e’、’E’等字符,并且数值在整数类型范围内(由PHP_INT_MAX定义),则将其评估为整数类型。否则,将其评估为浮点数类型。
数值的确定取决于字符串的开头部分。如果字符串以有效的数值数据开头,则使用该值。否则,值将为0。有效的数值数据由符号(可选)、一个或多个数字(可选包括小数点),以及可选的指数部分组成。指数部分的格式是在’e’或’E’后面跟着一个或多个数字。
另外,似乎需要排除第一个空格。
这是在将字符串转换为数值时出现的现象,有一定的规律,如果数据无效,则变为0。
所以,以下也适用。
if ( -"1" == -1 ){ print("true"); }
$test = "string" / 100; //これも正常に動く
我可以理解這個觀點,但感覺非常不舒服。