我最近創建了一個答案的SO,我開始意識到,我認爲是在PHP中一個奇怪的行爲,我從來沒有因發現我的(以下)的編碼風格:concat運算符和浮點標識符'。'的優先級。 (T_CONSTANT_ENCAPSED_STRING,T_DNUMBER)
$var = 1;
echo "test string ". $var+1 ." example";
這工作正常,但是如果我刪除1
和.
之間的空間:
echo "test string ". $var+1." example";
它會給我T_CONSTANT_ENCAPSED_STRING
語法錯誤,並且在這種情況下,期待一個','
或3210這是相當不正確。
是的..它會像這樣:
echo "test string ".($var+1)." example";
我與此遇到的問題是,該錯誤消息是,它並不能明確反映的是什麼潛在的問題希望大多數其他消息直接指向正確的地方。
雖然我起初並沒有想到浮動點是這個原因我仍然有一個很難理解爲什麼浮動運營商在以下情況下優先於毗連運算:
var_dump(.1, 1, 1., 1.0);
var_dump(1.."a", "a"..1, 1.0."a");
浮動(0.1),INT(1)中,浮子(1),浮子(1)
串(2) 「1A」,串(4) 「A0.1」,串(2) 「1A」
現在我明白算術運算符應該在字符串操作之前進行,但這裏只是我的一部分不明白:
".1
和1."
應該指出.
是一個毗連運算和1.1
應該指出.
是一個浮動的標識符。相反,他們都給解析錯誤。
PHP是不挑剔的語言時,它涉及到的變量類型:
var_dump(1 + 1.); // float(2)
var_dump(1. + 1); // float(2)
您可以簡單地使用+ 1
添加到一個浮動的,爲什麼解析1.
作爲浮動呢?解析錯誤發生在下一個令牌上,它在期望一個數字,甚至不允許它是一個concat操作符。
所以我的問題是,爲什麼PHP詞法分析器和扔這麼重視浮動識別如果echo 1."test"
將輸出1test
可以打破它現有的代碼?
我編輯了這個問題,以澄清我的意思,首先是由於我得到的負面代表。目前公認的答案仍然是非常有效的,因爲我需要一種方法來驗證PHP代碼,而無需使用
eval()
那是因爲'PHP'期待一個浮點因爲你旁邊的'integer'點。字符串「1.」不是有效的浮點數,因此錯誤爲 – DarkBee
https://eval.in/646594。這個'$ var + 1.'被視爲php中的類型轉換,而母雞缺少一個'.'。錯誤被給出 –
我的意思是說''var + 1.' worka作爲類型轉換,並且在解析器獲取「example」(字符串)之後,所以它給出了錯誤 –