PHP 7.3 có gì mới?
is_countable - Kiểm tra biến có đếm được hay không
count
cho một biến không đếm được bạn sẽ ăn WARNING chà bá lửa ngay:$website = 'https://chungnguyen.xyz';
count($website);
Warning: count(): Parameter must be an array or an object that implements Countable in ...
is_countable
(Kiểm tra biến có đếm được hay không) giúp cho bạn dễ dàng kiểm tra và tránh bị ăn warning$website = 'https://chungnguyen.xyz';
$count = is_countable($website) ? count($website) : null;
array_key_first và array_key_last
$array = [
'name' => 'Chung Nguyễn',
'website' => 'https://chungnguyen.xyz',
'length' => '16cm',
];
array_key_first($array); // 'name'
array_key_last($array); // 'length'
array_value_first
và array_value_last
cũng được đề nghị thêm vào, nhưng bị phủ quyết có lẽ chỉ cần có key của array rồi thì sẽ dễ dàng lấy được value nên đề nghị không được tán thành.
Linh hoạt trong cú pháp Heredoc và Nowdoc
// Ví dụ về Heredoc
$congi = 'mèo';
$caygi = 'cau';
$str = <<<CONMEO
Con $congi mà trèo cây $caygi,
Hỏi thăm chú chuột đi đâu vắng nhà.
Chú chuột đi chợ đường xa.
Mua mắm mua muối giỗ cha chú $congi.
CONMEO;
// Kết quả của echo $str; là:
// Con mèo mà trèo cây cau,
// Hỏi thăm chú chuột đi đâu vắng nhà.
// Chú chuột đi chợ đường xa.
// Mua mắm mua muối giỗ cha chú mèo.
// Ví dụ về Nowdoc
$str = <<<'CONMEO'
Con $congi mà trèo cây $caygi,
Hỏi thăm chú chuột đi đâu vắng nhà.
Chú chuột đi chợ đường xa.
Mua mắm mua muối giỗ cha chú $congi.
CONMEO;
// Kết quả của echo $str; là:
// Con $congi mà trèo cây $caygi,
// Hỏi thăm chú chuột đi đâu vắng nhà.
// Chú chuột đi chợ đường xa.
// Mua mắm mua muối giỗ cha chú $congi.
$congi
bằng mèo
và $caygi
bằng cau
tức là có gì in ra nấy.Parse error: syntax error, unexpected end of file in ... on line ...
$congi = 'mèo';
$caygi = 'cau';
$str = <<<CONMEO
Con $congi mà trèo cây $caygi,
Hỏi thăm chú chuột đi đâu vắng nhà.
Chú chuột đi chợ đường xa.
Mua mắm mua muối giỗ cha chú $congi.
CONMEO
CONMEO;
$congi = 'mèo';
$caygi = 'cau';
$str = <<<CONMEO
Con $congi mà trèo cây $caygi, <-- bị trừ đi 4 khoảng trắng
Hỏi thăm chú chuột đi đâu vắng nhà. <-- bị trừ đi 4 khoảng trắng
Chú chuột đi chợ đường xa. <-- bị trừ đi 4 khoảng trắng
Mua mắm mua muối giỗ cha chú $congi. <-- bị trừ đi 4 khoảng trắng
CONMEO; <-- có 4 khoảng trắng
// kết quả là:
// Con mèo mà trèo cây cau,
// Hỏi thăm chú chuột đi đâu vắng nhà.
// Chú chuột đi chợ đường xa.
// Mua mắm mua muối giỗ cha chú mèo.
// chứ không phải ntn đâu nhé
// Con mèo mà trèo cây cau,
// Hỏi thăm chú chuột đi đâu vắng nhà.
// Chú chuột đi chợ đường xa.
// Mua mắm mua muối giỗ cha chú mèo.
Có thể thêm dấu phẩy cuối cùng khi gọi function
variadic functions
(hàm có tham số không xác định, bao nhiêu cũng nuốt).namespace
.# PHP 7.2
use Foo\Bar\{
Foo,
Bar,
};
$foo = [
'foo',
'bar',
];
variadic functions
)// unset tè le hột me
unset(
$somethingIDontNeedAnymore,
$anotherOneToKill,
$letsMakeThisEasy,
);
// compact te le hột é
return view(
'welcome',
compact(
'title',
'body',
'comments',
)
);
// array_merge te le hàn the
$newArray = array_merge(
$arrayOne,
$arrayTwo,
['foo', 'bar'],
);
// var_dump te le nồi chè
var_dump(
$whatIsInThere,
$probablyABugInThisOne,
$oneMoreToCheck,
);
Báo cáo lỗi tốt hơn, cụ thể là type error
TypeErrors
cho số nguyên và booleans được sử dụng để in ra tên đầy đủ, nó đã được đổi thành int
và bool
, để khớp với type hints ở trong code.Argument 1 passed to foo() must be of the type int/bool
Argument 1 passed to foo() must be of the type
integer/boolean
Có thể throw JSON errors
json_decode()
và json_encode()
. Thật không may, cả hai đều không xử lý tối ưu được các lỗi. json_decode()
trả về null
khi lỗi, nhưng null
cũng có thể là một kết quả hợp lệ khi bạn decode một JSON "null". Cách duy nhất để biết khi nào có lỗi xảy ra bằng cách gọi json_last_error()
hoặc json_last_erro_msg
. Nhưng mà 2 hàm này nó không có ngăn chặn chương trình thực thi thế mới cay chớ 🙄🙄json_decode()
và json_encode()
là JSON_THROW_ON_ERROR
, khi bị lỗi sẽ throw một JsonException
class là class con của Exception
try {
json_encode($data, JSON_THROW_ON_ERROR);
json_decode("invalid json", null, 512, JSON_THROW_ON_ERROR);
} catch (\JsonException $e) {
// code
}
list
reference assignmentlist()
. RFC đề xuất cú pháp để cover nó như sau:$array = [1, 2];
list($a, &$b) = $array;
$array = [1, 2];
$a = $array[0];
$b =& $array[1];
/* Note; cú pháp []= cũng hoạt động tương tự */
[$a, &$b] = $array;
list()
ở phiên bản trước, bạn vẫn có thể sử dụng list()
lồng nhau$array = [1, 2, 3, [3, 4]];
list(&$a, $b,, list(&$c, $d)) = $array;
var_dump($array);
/*
array(4) {
[0]=>
&int(1)
[1]=>
int(2)
[2]=>
int(3)
[3]=>
array(2) {
[0]=>
&int(3)
[1]=>
int(4)
}
}
*/
$array = [[1, 2], [3, 4]];
foreach ($array as list(&$a, $b)) {
$a = 7;
}
var_dump($array);/*
array(2) {
[0]=>
array(2) {
[0]=>
int(7)
[1]=>
int(2)
}
[1]=>
array(2) {
[0]=>
&int(7)
[1]=>
int(4)
}
}
*/
Biến không xác định trong compact
compact()
một biến không xác định, bạn sẽ nhận được ngay một notice ngon lành cành đào ngay$a = 'foo';
compact('a', 'b');
// Notice: compact(): Undefined variable: b
Phản đối và loại bỏ Case-insensitive constant
define()
bạn sẽ thấy tham số thứ 3 $case_insensitive (trường hợp sơ ý) mặc định là false, nếu bạn code như thế này:define('CONSTANT', 'Hello world.', true);
// không phân biệt hoa thường
echo CONSTANT; // kết quả là: Hello world.
echo constant; // kết quả là: Hello world.
echo Constant; // kết quả là: Hello world.
Same site cookie
setcookie
, setrawcookie
và session_set_cookie_params
hoạt động theo cách không phá vỡ chúng.bool setcookie(
string $name
[, string $value = ""
[, int $expire = 0
[, string $path = ""
[, string $domain = ""
[, bool $secure = false
[, bool $httponly = false ]]]]]]
)
bool setcookie (
string $name
[, string $value = ""
[, int $expire = 0
[, array $options ]]]
)
// Cả 2 đều hoạt động. Set Same Site Cookie ở trường hợp 2
Không còn chấp nhận ở PHP 7.3
strpos
, strrpos
, stripos
, strripos
, strstr
, strchr
, strrchr
và stristr
) tham số thứ 2 ($needle) thông thường là string, nhưng nếu nạp vào không phải string nó sẽ convert thành số và được hiểu như ASCII. Ở PHP 7.3 nó sẽ ném ra một cảnh báo, vậy nên bạn hãy cố gắng nạp vào một string ở tham số thứ 2 nhé, PHP 8 sẽ không còn cảnh báo mà nó sẽ convert needle thành string.fgetss()
function và string.strip_tags filter sử dụng sẽ ăn cảnh báo, PHP 8 bỏ luôn.assert()
function: compile sẽ báo warning và PHP 8 compile sẽ báo errorFILTER_FLAG_SCHEME_REQUIRED
và FILTER_FLAG_HOST_REQUIRED
flagspdo_odbc.db2_instance_name
php.ini directive: Thêm thông báo không dùng nữa nếu trong php.ini
directive có giá trị pdo_odbc.db2_instance_name khi khởi tạo module.