2017-06-27 26 views
0

我最近將一個正在工作的codeigniter項目移到了一臺新的服務器上,同一個控制器的許多頁面都失敗了。我跟蹤下來到這條線PHP整數值打破整個控制器「服務器設置」?

$card['id'] = 00086;休息整個文件

$card['id'] = "00086";是好的,但鑄造爲字符串

$card['id'] = (int)"00086";的作品,但爲什麼呢?

$card['id'] = 86;有效,但爲什麼?

有沒有我不熟悉的服務器設置? 我甚至不在線中的功能,它打破了它後面的一切。

+0

你到底想要做什麼? –

+0

我真的只想知道爲什麼我可以對服務器進行更改,而不會遇到與另一個文件相同的問題......它在以前的服務器上工作就好了 – Dug

回答

3

這是因爲PHP試圖將數字解釋爲由於前導零引起的八進制數。例如

$a = 08; 
var_dump($a); 

將引發錯誤,因爲08不是有效的八進制數,而是因爲它是一個有效的八進制數

$a = 07; 
var_dump($a); 

不會引發錯誤。

$a = 0071; 
var_dump($a); 

會產生int(57)因爲在八進制,轉化爲57十進制71

documentation link說:

要使用八進制符號,前面加上0(零)的數目。要使用 十六進制符號在數字前面加上0x。要使用二進制 符號在數字前面加上0b。

順便說一句,(int)"0086"作品因爲PHP第一次遇到0086爲一個字符串,然後蒙上成整數所以數變爲在這種情況下86$var = 86適用於直接的原因,因爲它是有效的十進制數。