PHP 8.4.2 Released!

Sayısal Dizeler

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
?>

Sayısal bağlamlarda kullanılan dizeler

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:

  1. Dize sayısal ise, (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.
  2. Bağlam, öncü sayısal dizelere izin veriyorsa ve dize tek ise, (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.
  3. Dize sayısal değilse, bir TypeError yavrulanır.

PHP 8.0.0 öncesindeki davranış

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ı:

  • Öncü sayısal dize kullanımı E_WARNING yerine E_NOTICE seviyesinde bir hataya sebep olurdu.
  • Dize sayısal değilse, E_WARNING seviyesinde bir hata ortaya çıkar ve değer olarak 0 dönerdi.
PHP 7.1.0 öncesinde, ne 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
?>
add a note

User Contributed Notes 1 note

up
0
stromov1010 at mail dot ru
3 days ago
you should to add example without whitespaces:

$foo = 4 + "10.2LittlePiggies";
To Top