Tìm kiếm bài viết

Tìm hiểu PHP 7.4 và những thay đổi nổi bật mới nhất

07.04.2020

5.0/5 (1 Reviews)

Tìm hiểu PHP 7.4 và những thay đổi nổi bật mới nhất. Sắp tới đây PHP sẽ được nâng cấp lên phiên bản PHP8 nên phiên bản PHP 7 cuối cùng được Release chính là PHP74.

    Sắp tới đây PHP sẽ được nâng cấp lên phiên bản PHP8 nên phiên bản PHP 7 cuối cùng được Release chính là PHP74.phiên bản này mang đến nhiều tính năng mới, bổ sung cú pháp và sửa lỗi. Nên cũng không có gì là quá cao siêu cả.

    PHP 7.4 được phát hành vào ngày 28 tháng 11 năm 2019 mà tới giờ LPTech mới có cơ hội viết 1 bài cho các bạn đọc. Để xem Có gì mới trong PHP 7.4 này nhé. Hãy cùng LPTech điểm qua thôi nào, nếu bạn có biết thêm thông tin thì hãy chia sẻ với LP nhé.

    Xem thêm: Git là gì? Sử dụng Git nâng cao chuẩn Git-flow

    Các tính năng mới trong PHP 7.4

    PHP 7.4 đi kèm với một số lượng tính năng mới đáng kể. Chúng ta sẽ bắt đầu với một danh sách tất cả các tính năng mới, và sau đó xem xét các thay đổi và phản đối.

    Arrow function

    Các arrow function, còn được gọi là "short clourse".

    Trong khi trước đây bạn viết điều này: 

    array_map(function (User $user) { 
        return $user->id; 
    }, $users)
     ​

    Nhưng bây giờ bạn có thể viết thế này:

    array_map(fn (User $user) => $user->id, $users)​


    Có một vài lưu ý về arrow function:

    • Chúng luôn có thể truy cập phạm vi cha mẹ, không cần từ khóa use.

    • $this có sẵn giống như clourse bình thường.

    • Các arrow function chỉ có thể chứa một biểu thức, đó cũng là câu lệnh return.

    $result = Collection::from([1, 2])
        ->map(function ($v) {
            return $v * 2;
        })
        ->reduce(function ($tmp, $v) {
            return $tmp + $v;
        }, 0);
    
    echo $result; // 6
    
    // with arrow functions:
    $result = Collection::from([1, 2])
        ->map(fn($v) => $v * 2)
        ->reduce(fn($tmp, $v) => $tmp + $v, 0);
    
    echo $result; // 6

    Typed Properties

    Các biến trong class có thể được gợi ý:

    class LPTechClass
    {
        public string $name;
        public ?Foo $foo;
    }
     

    Có rất nhiều điều để nói về tính năng này, nhưng chúng ta sẽ đi chi tiết ở bài viết khác nhé.

    Xem thêm: Các loại chuẩn hoá trong CSDL Quan hệ

    Type Variance

    Thật tốt khi thấy một số cải tiến đang thực sự đến trong lõi của PHP.

    Bạn có thể sử dụng covariant return types -

    class ParentType {}
    class ChildType extends ParentType {}
    
    class A
    {
        public function covariantReturnTypes(): ParentType
        { /* … */ }
    }
    
    class B extends A
    {
        public function covariantReturnTypes(): ChildType
        { /* … */ }
    }
     ​

     

    - và contravariant arguments

    class A
    {
        public function contraVariantArguments(ChildType $type)
        { /* … */ }
    }
    
    class B extends A
    {
        public function contraVariantArguments(ParentType $type)
        { /* … */ }
    }

    Toán tử gán kết hợp Null

    Tiếp theo là toán tử gán kết hợp null.

    Viết tắt cho các hoạt động liên kết null. Thay vì làm điều này:

    $data['date'] = $data['date'] ?? new DateTime();

    Bạn có thể làm thế này:

    $data['date'] ??= new DateTime();

    Spread Operator

    Tiếp theo, giờ đây có thể sử dụng toán tử trải rộng trong mảng.

    $arrayA = [1, 2, 3];
    
    $arrayB = [4, 5];
    
    $result = [0, ...$arrayA, ...$arrayB, 6 ,7];
    
    // [0, 1, 2, 3, 4, 5, 6, 7]

    Lưu ý rằng điều này chỉ hoạt động với các mảng với key là số. Key là chuỗi chưa được hỗ trợ.

    Ký tự phân tách số

    PHP 7.4 cho phép sử dụng dấu gạch dưới để phân tách trực quan các giá trị số. Nó trông như thế này:

    $unformattedNumber = 107925284.88;
    
    $formattedNumber = 107_925_284.88;
                          ^   ^​ Các dấu gạch dưới chỉ đơn giản là bị bỏ qua bởi PHP Engine.

     Các dấu gạch dưới chỉ đơn giản là bị bỏ qua bởi PHP Engine.

    Foreign funtion interface - FFI

    Chuyển sang một số tính năng cấp độ cốt lõi hơn: Foreign funtion interface gọi tắt là 'FFI', cho phép chúng ta gọi code C từ userland.

    Điều này có nghĩa là các phần mở rộng PHP có thể được viết bằng PHP thuần túy và được tải thông qua composer.

    Cần lưu ý rằng đây là một chủ đề phức tạp. Bạn vẫn cần có kiến ​​thức C để có thể sử dụng đúng tính năng này.

    <?php
    // tạo đối tượng FFI, tải libc và xuất hàm printf ()
    $ffi = FFI::cdef(
        "int printf(const char *format, ...);", // khai báo bằng syntax của C như thôi.
        "libc.so.6");
    // gọi đến hàm printf()trong libraries của C
    $ffi->printf("Hello %s!\n", "LPTech");
    // >> Hello LPTech
    ?>

    Preloading

    Một tính năng cấp thấp hơn là Preloading. Đây là một bổ sung tuyệt vời cho phần lõi của PHP, nó có thể dẫn đến một số cải tiến hiệu suất đáng kể.

    Nói tóm lại: Nếu bạn đang sử dụng một framework, các tệp của nó phải được tải và liên kết theo mọi request. Preloading cho phép máy chủ tải các tệp PHP trong bộ nhớ khi khởi động và có sẵn cho tất cả các request tiếp theo.

    Việc tăng hiệu suất tất nhiên đi kèm với một cái giá hợp lý: Nếu nguồn của các tệp được tải sẵn bị thay đổi, máy chủ phải được khởi động lại.

    Xem thêm: Những lỗi thiết kế cơ sở dữ liệu thường gặp

    Custom object serialization

    Hai magic method mới đã được thêm vào: __serialize và __unserialize. trong phiên bản PHP 7.4. Sự khác biệt giữa các phương thức này và __sleep và __wakeup 

    Ánh xạ cho các tham chiếu

    Các thư viện như var dumper của Symfony phụ thuộc rất nhiều vào Relection API để kết xuất một biến đáng tin cậy

    Trước đây không thể ánh xạ đúng các tham chiếu, dẫn đến các thư viện này dựa vào các bản hack để phát hiện chúng.

    $array2 = $array1;
    $array2[$key] = $unique_cookie;
    if ($array1[$key] === $unique_cookie) {
        // $array1[$key] is a reference
    }

    PHP 7.4 đã thêm class ReflectionReference để giải quyết vấn đề này.

    final class ReflectionReference {
        /* Returns ReflectionReference if array element is a reference, null otherwise. */
        public static function fromArrayElement(array $array, int|string $key): ?ReflectionReference;
     
        /* Returns unique identifier for the reference. The return value format is unspecified. */
        public function getId(): int|string;
     
        private function __construct(); // Always throws
        private function __clone(); // Always throws
    }

    Weak references

    Weak reference là các tham chiếu đến các đối tượng, mà không ngăn chặn chúng bị phá hủy. Tham chiếu yếu cho phép lập trình viên giữ lại một tham chiếu đến một đối tượng không ngăn đối tượng bị phá hủy; Chúng rất hữu ích để thực hiện bộ đệm như cấu trúc. Chúng hiện được hỗ trợ trong PHP bởi phần mở rộng.

    final class WeakReference {
        public static function create(object $object) : WeakReference;
     
        public function get() : ?object;
    }

    Thêm mb_str_split

    Hàm này cung cấp chức năng tương tự như str_split, nhưng trên các chuỗi nhiều byte.

    <?php 
    print_r(mb_str_split("lptech", 2));
     
    --EXPECT--
     
    Array
    (
        [0] => lp
        [1] => te
        [2] => ch
    )

    Password hashing register

    Những thay đổi bên trong đã được thực hiện đối với cách sử dụng các thư viện hashing, để người dùng dễ dàng sử dụng chúng hơn

    Cụ thể hơn, một hàm password_acheos mới đã được thêm vào, nó trả về một danh sách tất cả các thuật toán mật khẩu đã đăng ký

    RFC có một chút không rõ ràng về lợi ích, may mắn thay, Sara có thể cung cấp thêm một số bối cảnh:

    struct php_password_algo {
        const char* name; // Symbolic name of the algorithm, e.g. "argon2id"
        zend_string* (*hash)(const zend_string* password, zend_array* options);
        zend_bool (*verify)(const zend_string* password, const zend_string* hash);
        zend_bool (*needs_rehash)(const zend_string* hash, zend_array *options);
        int (*get_info)(zval *return_value, const zend_string* hash);
        zend_bool (*valid)(const zend_string* hash);
      };

    Điều đó có nghĩa là ext / sodium (hoặc bất kỳ ai) có thể đăng ký thuật toán băm mật khẩu một cách linh hoạt. Kết quả cuối cùng là argon2i và argon2id sẽ phổ biến hơn.

    Một số thay đổi và Không dùng nữa

    Bên cạnh các tính năng mới, cũng có rất nhiều thay đổi về ngôn ngữ. Hầu hết các thay đổi này là không phá vỡ, mặc dù một số có thể có ảnh hưởng đến code base của bạn.

    Lưu ý rằng có một số thông báo không dùng nữa cho các lập trình viên là một số tính năng sẽ bị xóa hoặc thay đổi trong tương lai. Sẽ tốt hơn nếu bạn không bỏ qua các cảnh báo và khắc phục chúng ngay lập tức.

    Vì nó sẽ làm làm cho bạn có thể nâng cấp lên PHP 8.0 dễ dàng hơn.

    Left-associative ternary

    Toán tử ternary có một số quirks kỳ lạ trong PHP. RFC này thêm một cảnh báo không dùng nữa cho các câu lệnh ternary lồng nhau. Trong PHP 8, nó sẽ được chuyển thành runtime error.

    1 ? 2 : 3 ? 4 : 5;   // deprecated
    (1 ? 2 : 3) ? 4 : 5; // ok​

    Ngoại lệ được phép trong __toString

    Trước đây, các ngoại lệ không thể được ném trong __toString. Chúng đã bị cấm vì một cách giải quyết đối với một số cơ chế xử lý lỗi cốt lõi cũ, nhưng Nikita chỉ ra rằng 'giải pháp' này không thực sự giải quyết được vấn đề mà nó đã cố gắng giải quyết.

    $reflectionClass = new ReflectionClass('Exception');
    echo $reflectionClass->__toString();

    Hành vi này hiện đã được thay đổi và ngoại lệ có thể được ném từ __toString.

    Concatenation

    Nếu bạn đã từng viết một cái gì đó như thế này:

    echo "sum: " . $a + $b;​

    PHP trước đây sẽ thông dịch nó thế này:

    echo ("sum: " . $a) + $b;

    Nhưng, PHP 8 sẽ làm cho nó được thông dịch như thế này:

    echo "sum :" . ($a + $b);​

    PHP 7.4 thêm cảnh báo không dùng nữa khi gặp biểu thức có chứa một dấu . trước dấu một dấu + hoặc -.

    array_merge không tham số

    Kể từ khi thêm spread operator, có thể có trường hợp bạn muốn sử dụng array_merge như vậy:

    $merged = array_merge(...$arrayOfArrays);​


    Để hỗ trợ trường hợp trong đó $arrayOfArrays sẽ trống, cả array_merge và array_merge_recursive hiện cho phép một danh sách tham số trống.

    Một mảng trống sẽ được trả về nếu không có đầu vào nào được truyền. Dấu ngoặc nhọn để truy cập mảng và chuỗi

    Có thể truy cập các mảng và chuỗi bằng dấu ngoặc nhọn:

    $array{1};
    $string{3};​

    Cái này sẽ không dùng nữa. Thông báo truy cập mảng không hợp lệ. Nếu bạn đã sử dụng cú pháp truy cập mảng trên, giả sử, một số nguyên.

    PHP trước đây sẽ trả về null. Kể từ PHP 7.4, một thông báo sẽ được phát ra.

    $i = 1;
    
    $i[0]; // Notice​

    Cải tiến proc_open

    Các thay đổi đã được thực hiện cho proc_open để nó có thể thực thi các chương trình mà không cần thông qua shell.

    Điều này được thực hiện bằng cách chuyển một mảng thay vì một chuỗi cho lệnh.

    strip_tags cũng chấp nhận mảng

    Bạn đã từng chỉ có thể tách nhiều tag như vậy:

    strip_tags($string, '<a><p>')

    PHP 7.4 cũng cho phép sử dụng một mảng:

    strip_tags($string, ['a', 'p'])​

    Extension ext-hash sẽ luôn được kích hoạt sẳn

    Phần mở rộng này hiện có sẵn vĩnh viễn trong tất cả các bản cài đặt PHP.

    PEAR không còn có sẵn mặc định

    Vì PEAR không được duy trì tích cực nữa, nên Core Team đã quyết định xóa cài đặt mặc định của nó với PHP 7.4 chia buồn cùng PEAR.

    Deprecate ext/wwdx

    WDDX đã được thiết kế dưới dạng định dạng trao đổi dữ liệu độc lập với ngôn ngữ lập trình cho web1). Tuy nhiên, nó chưa bao giờ được chuẩn hóa chính thức và có vẻ như nó hầu như bị áp đảo bởi các định dạng trao đổi dữ liệu khác như JSON.

    Rõ ràng, mã sử dụng tiện ích mở rộng wddx sẽ đưa ra cảnh báo không dùng nữa và / hoặc sẽ phải sử dụng tiện ích mở rộng wddx từ PECL (hoặc ở một nơi khác) hoặc được viết lại.

    Nếu bạn đang học PHP thì mình xin giới thiệu đến bạn bộ tài liệu khá hay này Ebook học PHP7tài liệu rất chi tiết và cụ thể của Nắng Việt.

    CÓ THỂ BẠN QUAN TÂM

    Bài Viết Cùng Chuyên Mục

    XEM THÊM
    thumbnail

    Kubernetes bài 6 - Vận hành k8s Day-Two Operations và Quản trị bằng GitOps

    22.05.2026

    Khi cụm Kubernetes của bạn đã được bảo mật cấu hình, tối ưu tài nguyên và thiết lập tự phục hồi, câu hỏi đặt ra là làm sao để duy trì sự ổn định đó trong nhiều năm tiếp theo mà không bị phụ thuộc

    thumbnail

    Kubernetes bài 5 - bảo mật Cloud Native và chuẩn DevSecOps cho K8s

    22.05.2026

    Việc siết chặt an ninh (Hardening) không phải là cấu hình một vài thông số rồi bỏ đó, mà là một tư duy phòng thủ chiều sâu.

    thumbnail

    Kubernetes bài 4 - Tối ưu Resource Auto-Healing và Scale Zero-Downtime

    22.05.2026

    Bài viết này sẽ đi sâu vào các cơ chế ở tầng Kernel giúp hệ thống tự phục hồi, chống lại các đợt tấn công cạn kiệt tài nguyên và cập nhật phiên bản mới mà người dùng không hề hay biết.

    thumbnail

    Kubernetes bài 3 - Bảo mật cấu hình k8s và config Security trên Production

    22.05.2026

    Kubernetes giải quyết bài toán này bằng hai đối tượng chuyên biệt nhưng nếu không hiểu rõ bản chất bảo mật ở tầng dưới, bạn đang tự tay dâng toàn bộ chìa khóa hệ thống cho hacker.

    thumbnail

    Kubernetes bài 2 - Mạng lưới k8s và luồng Traffic ở Packet Level

    22.05.2026

    Pod không chỉ là một container: Rất nhiều người nhầm lẫn Pod 1-1 với Container. Thực chất, Pod là đơn vị triển khai nhỏ nhất, có thể chứa một hoặc nhiều container

    Mục lục bài viết