我转向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; //これも正常に動く

我可以理解這個觀點,但感覺非常不舒服。

广告
将在 10 秒后关闭
bannerAds