Pengubahsuaian mekanisme pemprosesan rentetan


1. Rentetan yang mengandungi aksara perenambelasan tidak lagi dianggap sebagai nombor

Rentetan yang mengandungi aksara perenambelasan tidak lagi dianggap sebagai nombor dan tidak lagi akan dilayan secara berbeza. Contohnya, kod berikut:

var_dump("0x123" == "291");     // bool(false)     (previously true)
var_dump(is_numeric("0x123"));  // bool(false)     (previously true)
var_dump("0xe" + "0x1");        // int(0)          (previously 16)
var_dump(substr("foo", "0x1")); // string(3) "foo" (previously "oo")
// Notice: A non well formed numeric value encountered
boleh menggunakan fungsi filter_var untuk menyemak sama ada rentetan mengandungi aksara perenambelasan atau sama ada ia boleh ditukar kepada integer
$str = "0xffff";
$int = filter_var($str, FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX);
if (false === $int) {
    throw new Exception("Invalid integer!");
}
var_dump($int); // int(65535)

2. Jika u{ mengandungi aksara haram kemudian, ralat akan dilaporkan

Petikan berganda dan sintaks melarikan diri titik kod Unicode telah ditambahkan pada tatabahasa "u{" mesti diikuti oleh aksara UTF-8. Jika ia adalah aksara bukan utf-8, ralat akan dilaporkan:

$str = "\u{xyz}"; // Fatal error: Invalid UTF-8 codepoint escape sequence
boleh mengelakkan ralat ini dengan melarikan diri dari yang pertama.
 $str = "\u{xyz}"; // Works fine

Jika tiada { selepas "u", ia tidak memberi kesan:

$str = "\u202e"; // Works fine

PHP IntlChar()

PHP 7 menyokong pengantarabangsaan (i18n) dan penyetempatan (l10n.) melalui sambungan intl. Sambungan ini hanyalah pembungkus asas untuk perpustakaan ICU dan menyediakan kaedah dan ciri yang serupa dengan perpustakaan ICU.

PHP 7 mendedahkan ciri aksara Unikod dalam ICU melalui kelas IntlChar baharu. Kelas ini sendiri mentakrifkan banyak kaedah statik untuk memanipulasi aksara unikod dalam beberapa set aksara.

Contoh

<?php
printf('%x', IntlChar::CODEPOINT_MAX);
echo IntlChar::charName('@');
var_dump(IntlChar::ispunct('!'));
?>

Hasil output perlaksanaan program di atas ialah:

10ffff
COMMERCIAL AT
bool(true)