Bir PHP dizesi, int veya float olarak yorumlanabiliyorsa sayısal kabul edilir.
Resmi olarak PHP 8.0.0'dan itibaren:
WHITESPACES \s* LNUM [0-9]+ DNUM ([0-9]*[\.]{LNUM}) | ({LNUM}[\.][0-9]*) EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM}) INT_NUM_STRING {WHITESPACES} [+-]? {LNUM} {WHITESPACES} FLOAT_NUM_STRING {WHITESPACES} [+-]? ({DNUM} | {EXPONENT_DNUM}) {WHITESPACES} NUM_STRING ({INT_NUM_STRING} | {FLOAT_NUM_STRING})
PHP ayrıca öncü sayısal dizeler kavramına sahiptir. Bu, sayısal bir dizge gibi başlayan ve ardından herhangi bir karakter gelen bir dizedir.
Bilginize:
Sayılarla sınırlanmış (harfe büyüklüğüne duyarsız)
E
harfini içeren herhangi bir dizge, bilimsel gösterimiyle ifade edilen bir sayı olarak görülecektir. Bu beklenmedik sonuçlar doğurabilir.<?php
var_dump("0D1" == "000"); // yanlış, "0D1" bilimsel gösterim değil
var_dump("0E1" == "000"); // doğru, "0E1" => 0 * (10 ^ 1), yani 0
var_dump("2E1" == "020"); // doğru, "2E1" => 2 * (10 ^ 1), yani 20
?>
Bir dizenin sayı olarak değerlendirilmesi gerektiğinde (örneğin, aritmetik işlemler, int tür bildirimi, vb.), Sonucu belirlemek için aşağıdaki adımlar atılır:
PHP_INT_MAX
tarafından
tanımlandığı gibi) int türü sınırlarına uyuyorsa ve
dize bir tamsayı sayısal dizeyse, int olarak çözümlenir,
aksi takdirde bir float olarak çözümlenir.
PHP_INT_MAX
tarafından tanımlandığı gibi)
int türü sınırlarına uyuyorsa ve dizenin baştaki bölümü
bir tamsayı sayısal dizeyse, int olarak çözümlenir,
aksi takdirde bir float olarak çözümlenir. Ek olarak
E_WARNING
seviyesinde bir hata ortaya çıkar.
PHP 8.0.0 öncesinde, bir dize yalnızca, önünde beyaz boşluklar varsa sayısal, sonunda beyaz boşluklar varsa öncü sayısal dize olduğu kabul edilirdi.
PHP 8.0.0 öncesinde, bir dize sayısal bir bağlamda kullanıldığında, yukarıdaki adımlar aşağıdaki farklılıklarla uygulanırdı:
E_WARNING
yerine
E_NOTICE
seviyesinde bir hataya sebep olurdu.
E_WARNING
seviyesinde
bir hata ortaya çıkar ve değer olarak 0
dönerdi.
E_NOTICE
ne de E_WARNING
seviyesinde bir hata ortaya çıkardı.
<?php
$foo = 1 + "10.5"; // $foo bir float (11.5)
$foo = 1 + "-1.3e3"; // $foo bir float (-1299)
$foo = 1 + "bob-1.3e3"; // PHP 8.0.0 sonrasında TypeError, öncesinde int (1)
$foo = 1 + "bob3"; // PHP 8.0.0 sonrasında TypeError, öncesinde int (1)
$foo = 1 + "10 Small Pigs"; // $foo bir int (11) ve PHP 8.0.0 sonrasında E_WARNING, öncesinde E_NOTICE
$foo = 4 + "10.2 Little Piggies"; // $foo bir float (14.2) ve PHP 8.0.0 sonrasında E_WARNING, öncesinde E_NOTICE
$foo = "10.0 pigs " + 1; // $foo bir float (11) ve PHP 8.0.0 sonrasında E_WARNING, öncesinde E_NOTICE
$foo = "10.0 pigs " + 1.0; // $foo bir float (11) ve PHP 8.0.0 sonrasında E_WARNING, öncesinde E_NOTICE
?>