algolia search

Tìm thấy x bài viết trong xms.

PHP 7.3 có gì mới?

PHP 7.3 có gì mới?


is_countable - Kiểm tra biến có đếm được hay không

Có thể bạn chưa biết đó là ở phiên bản PHP 7.2, nếu bạn dùng hàm 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 ...

Vậy cho nên, phiên bản PHP 7.3 đã cho ra mắt hàm 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

Đơn giản là 2 hàm này sẽ trả về giá trị của key đầu tiền và key cuối cùng trong mảng

$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

Nếu đọc qua thấy Heredoc, Nowdoc mà các bạn chưa hình dung ra nó là gì thì mình ôn lại chút xíu bằng ví dụ của Heredoc nhé

// 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.

Nó bắt đầu bằng <<< tiếp theo sau đó là open tag như HTML vậy và cuối cùng là close tag (cả open và close tag bắt buộc xuống dòng nhé). Nowdoc cũng tương tự như Heredoc nhưng nó sẽ không thay thế $congi bằng mèo$caygi bằng cau tức là có gì in ra nấy.

Ở phiên bản trước close tag CONMEO kia bắt buộc phải nằm dí sát vào lề văn bản 😁😁 chỉ cần nhích một chút thôi là bạn ăn củ tỏi như dưới ngay

Parse error:  syntax error, unexpected end of file in ... on line ...

Chính sự linh hoạt này cũng nảy sinh một vấn đề nhỏ đó là có thể một số Heredoc bạn định nghĩa sẽ bị 'break'

$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;

Lưu ý là: close tag ở ví dụ trên là CONMEO ấy, nó mà dóng hàng bao nhiêu thì nội dung ở bên trong sẽ bị trừ đi tương ứng, ví dụ cho dễ hiểu nhé

$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

Việc cho phép thêm dấu phẩy sau lệnh gọi hàm làm cho việc bổ sung tham số trong nhiều ngữ cảnh trở nên thuận tiên hơn, khi bạn gọi hàm có nhiều đối số, đặc biệt là các variadic functions (hàm có tham số không xác định, bao nhiêu cũng nuốt).

Từ phiên bản PHP 7.2 , việc thêm dấu phẩy đã được sử dụng trong cú pháp khai báo mảng, cũng nhưng cú pháp namespace .

# PHP 7.2
use Foo\Bar\{
    Foo,
    Bar,
};
 
$foo = [
    'foo',
    'bar',
];

Dấu phẩy cuối cùng khi gọi function làm cho nó trở nên điên rồ khi gọi bất kỳ hàm nào thuộc dạng nhiều tham số như ở trên (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,
);

Method của class và Closure căn bản vẫn là hàm nên cũng tương tự.

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 bool, để khớp với type hints ở trong code.

Argument 1 passed to foo() must be of the type int/bool

So với PHP 7.2:

Argument 1 passed to foo() must be of the type 
integer/boolean

Có thể throw JSON errors

PHP hiện có 2 hàm để xử lý JSON là json_decode()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ớ 🙄🙄

Trong phiên bản PHP 7.3, một tính năng mới được đề xuất thay thế là bổ sung một giá trị flag mới cho json_decode()json_encode()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 assignment

Hiện tại PHP chỉ có thể sử dụng các reference assignement với list(). RFC đề xuất cú pháp để cover nó như sau:

$array = [1, 2];
list($a, &$b) = $array;

Nó cũng tương đương với:

$array = [1, 2];
$a = $array[0];
$b =& $array[1];

/* Note; cú pháp []=  cũng hoạt động tương tự */
[$a, &$b] = $array;

Tất nhiên, điều đó hoạt động giống như 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)
  }
}
*/

Hoạt động bình thường với foreach()

$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

Nếu bạn nạp vào hàm 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

Nếu bạn định nghĩa hằng số bằng hàm 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.

Phiên bản PHP 7.3 sẽ loại bỏ tham số thứ 3 này! Các bạn lưu ý khi nâng cấp PHP version nhé.

Same site cookie

Thay đổi này không chỉ thêm một tham số mới, nó cũng thay đổi cách các hàm setcookie, setrawcookiesession_set_cookie_params hoạt động theo cách không phá vỡ chúng.

RFC đã bỏ phiếu tán thành trường hợp thứ 2 đó là thay vì thêm một tham số nữa vào các hàm đã có sẵn, giờ đây chúng hỗ trợ một loạt các tùy chọn, trong khi vẫn còn tương thích ngược. Ví dụ:

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

Việc bổ sung Same Site Cookie có ý nghĩa rất lớn trong việc phòng chống attack CSRF, XSS và XSSI

Không còn chấp nhận ở PHP 7.3

Một số điều nhỏ sẽ không được chấp nhận ở phiên bản PHP 7.3 này, một lỗi khả năng xảy ra trong code của bạn vì điều này.

  • Bỏ khỏi document mbstring function aliases
  • Các hàm tìm kiếm String (strpos, strrpos, stripos, strripos, strstr, strchr, strrchrstristr)  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 error
  • FILTER_FLAG_SCHEME_REQUIREDFILTER_FLAG_HOST_REQUIRED flags
  • pdo_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.

🔶🔶🔶🔶🔶🔶🔶🔶

Đánh giá bài viết

Thích thì like
PHP 7.3 có gì mới?
5/5 1 votes

Bình luận

Quốc Danh Tăng avatar
Quốc Danh Tăng
Mình đang dùng host dành riêng cho wordpress. Mình đang sử dụng WP 5.1. PHP 7.2 trên host. Nhưng không hiểu sao khi chuyển qua PHP 7.1 có trên host thì web site : https://xetaitot.com của mình lại không hoạt động. 
Bạn cho mình hỏi là do Host hay do WP
Hiển thị bình luận Facebook