Có gì mới trong PHP 7.4


PHP 7.4 là phiên bản ổn định mới nhất của PHP. Nó được phát hành vào ngày 28 tháng 11 năm 2019 và là phiên bản cuối cùng trước PHP 8. Nó mang lại nhiều tính năng mới, bổ sung và sửa lỗi cú pháp. Trong bài đăng này, bạn sẽ tìm thấy danh sách mọi thứ mới và đã thay đổi để giúp bạn chuẩn bị cho việc nâng cấp. Hãy bắt đầu với một vài điểm nổi bật, có trong PHP 7.4:

# Các tính năng mới

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

Tuy nhiên, một lưu ý trước khi chúng ta đi sâu vào: nếu bạn vẫn đang sử dụng phiên bản PHP thấp hơn, bạn cũng sẽ muốn đọc những tính năng mới trong PHP 7.3.


# Chức năng mũi tên rfc

Các hàm mũi tên, còn được gọi là “đóng ngắn”, cho phép các hàm một lớp ít dài dòng hơn.

Mặc dù trước đây bạn đã viết điều này:

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

Bây giờ bạn có thể viết điều này:

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

Có một số lưu ý về chức năng mũi tên:

  • Họ luôn có thể truy cập phạm vi chính, không cần use từ khóa.
  • $this có sẵn giống như đóng cửa bình thường.
  • Các hàm mũi tên chỉ có thể chứa một biểu thức, đó cũng là câu lệnh return.

Bạn có thể đọc sâu về chúng ở đây.



# Thuộc tính được gõ rfc

Các biến lớp có thể được gợi ý kiểu:

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

Có rất nhiều điều để nói về tính năng này, vì vậy tôi đã viết một bài riêng về chúng.


# Cải thiện phương sai loại rfc

Trước đây tôi cũng đã viết về hệ thống kiểu của PHP, vì vậy thật tốt khi thấy một số cải tiến đang thực sự xuất hiện trong lõi của PHP.

Phương sai kiểu là một chủ đề khác đáng để đăng trên blog, nhưng tóm lại: bạn sẽ có thể sử dụng kiểu trả về hiệp biến –

class ParentType {}
class ChildType extends ParentType {}

class A
{
    public function covariantReturnTypes(): ParentType
    {  }
}

class B extends A
{
    public function covariantReturnTypes(): ChildType
    {  }
}

– và những lập luận trái ngược nhau.

class A
{
    public function contraVariantArguments(ChildType $type)
    {  }
}

class B extends A
{
    public function contraVariantArguments(ParentType $type)
    {  }
}

Nhận thấy một tpyo? Bạn có thể gửi PR để sửa nó. Nếu bạn muốn cập nhật về những gì đang diễn ra trên blog này, bạn có thể Theo dõi danh sách gửi thư của tôi: gửi email đến [email protected] và tôi sẽ thêm bạn vào danh sách.

# Toán tử gán hợp nhất Null rfc

Tiếp theo là toán tử gán kết hợp null, một cách viết tắt của các hoạt động kết hợp null. Thay vì làm điều này:

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

Bạn có thể làm được việc này:

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

Bạn có thể đọc thêm về toán tử này trong bài viết của tôi về cách viết tắt PHP.


# Toán tử dàn trải mảng rfc

Tiếp theo, giờ đây bạn 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);

Lưu ý rằng điều này chỉ hoạt động với các mảng có khóa số, kể từ PHP 8.1, bạn cũng có thể giải nén mảng bằng các khóa chuỗi.


# Dấu phân cách chữ số rfc

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

$unformattedNumber = 107925284.88;

$formattedNumber = 107_925_284.88;

Các dấu gạch dưới đơn giản bị động cơ bỏ qua.


#Giao diện chức năng ngoại rfc

Chuyển sang một số tính năng cấp cốt lõi hơn: giao diện chức năng nước ngoài hay gọi tắt là “FFI”, cho phép chúng tôi gọi mã C từ vùng người dùng. Đ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 trình soạn thảo.

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 về C để có thể sử dụng đúng tính năng này.


# Đang tải trước rfc

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

Tóm lại: nếu bạn đang sử dụng một khung, các tệp của khung đó phải được tải và liên kết theo mọi yêu cầu. Tải trước cho phép máy chủ tải các tệp PHP vào bộ nhớ khi khởi động và để chúng sẵn sàng vĩnh viễn cho tất cả các yêu cầu tiếp theo.

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

Bạn muốn biết thêm? Tôi đã viết một bài riêng về cách thiết lập và sử dụng tính năng tải trước và cũng đã thực hiện một số tiêu chuẩn tải trước.


# Tuần tự hóa đối tượng tùy chỉnh rfc

Hai phương pháp ma thuật mới đã được thêm vào: __serialize__unserialize. Sự khác biệt giữa các phương pháp này và __sleep__wakeup được thảo luận trong RFC.


# Phản ánh để tham khảo rfc

Các thư viện như var dumper của Symfony phụ thuộc rất nhiều vào API phản chiếu để kết xuất một biến một cách đáng tin cậy. Trước đây không thể phản ánh chính xác các tài liệu tham khảo, dẫn đến việc các thư viện này phải dựa vào hack để phát hiện chúng.

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


# Tài liệu tham khảo yếu rfc

Tham chiếu yếu là tham chiếu đến các đối tượng, điều này không ngăn chúng bị phá hủy.


# mb_str_split thêm rfc

Chức năng này cung cấp chức năng tương tự như str_splitnhưng trên chuỗi nhiều byte.


# Sổ đăng ký băm mật khẩu rfc

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

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

RFC có phần 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:

Điều đó có nghĩa là ext/sodium (hoặc bất kỳ ai thực sự) 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 trong tương lai


# Thay đổi và ngừng sử dụng

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

Lưu ý rằng cảnh báo ngừng sử dụng không phải là “vi phạm” theo định nghĩa mà chỉ là thông báo cho nhà phát triển rằng chức 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 không dùng nữa và khắc phục chúng ngay lập tức; vì nó sẽ làm cho quá trình nâng cấp PHP 8.0 trở nên dễ dàng hơn.


# Ngừng sử dụng toán tử ba ngôi liên kết trái rfc

Toán tử bậc ba có một số điểm kỳ lạ trong PHP. RFC này bổ sung cảnh báo không dùng nữa cho các câu lệnh ternary lồng nhau. Trong PHP 8, việc ngừng sử dụng này sẽ được chuyển thành lỗi thời gian biên dịch.

1 ? 2 : 3 ? 4 : 5;   
(1 ? 2 : 3) ? 4 : 5; 

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

Trước đây, ngoại lệ không thể được đưa vào __toString. Chúng bị cấm vì một giải pháp thay thế cho 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.

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


# Ưu tiên nối rfc

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

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

PHP trước đây sẽ diễn giải nó như thế này:

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

PHP 8 sẽ làm cho nó được diễn giải 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 một biểu thức không được đóng ngoặc có chứa một . trước khi một + hoặc - dấu hiệu.


# array_merge không có đối số nâng cấp

Vì việc bổ sung toán tử trải rộng nên 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 cạnh nơi $arrayOfArrays sẽ trống rỗng, cả hai array_mergearray_merge_recursive bây giờ 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 chuyển.


# Dấu ngoặc nhọn để truy cập mảng và chuỗi rfc

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

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

Điều này đã không còn được dùng nữa.


# Thông báo truy cập mảng không hợp lệ rfc

Nếu bạn sử dụng cú pháp truy cập mảng trên một số nguyên; PHP trước đây sẽ trở lại null. Kể từ PHP 7.4, một thông báo sẽ được đưa ra.

$i = 1;

$i(0); 

# proc_open cải tiến nâng cấp

Những thay đổi đã được thực hiện để 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 truyền một mảng thay vì một chuỗi cho lệnh.


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

Trước đây bạn chỉ có thể tách nhiều thẻ như vậy:

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

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

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

# ext-hash luôn được kích hoạt rfc

Tiện ích 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 bật theo mặc định bên ngoài

Vì PEAR không được duy trì tích cực nữa nên nhóm nòng cốt đã quyết định xóa cài đặt mặc định của nó bằng PHP 7.4.


# Một số lỗi nhỏ rfc

RFC này bao gồm rất nhiều điểm không dùng nữa, mỗi điểm có phiếu bầu riêng. Hãy nhớ đọc phần giải thích chi tiết hơn trên trang RFC, mặc dù đây là danh sách những thứ không được dùng nữa:

  • Các real kiểu
  • Di sản trích dẫn ma thuật
  • array_key_exists() với đồ vật
  • FILTER_SANITIZE_MAGIC_QUOTES lọc
  • Sự phản xạ export() phương pháp
  • mb_strrpos() với mã hóa làm đối số thứ 3
  • implode() trộn thứ tự tham số
  • Bỏ ràng buộc $this từ việc đóng cửa không tĩnh
  • hebrevc() chức năng
  • convert_cyr_string() chức năng
  • money_format() chức năng
  • ezmlm_hash() chức năng
  • restore_include_path() chức năng
  • allow_url_include chỉ thị ini

# Những thay đổi khác nâng cấp

Bạn phải luôn xem tài liệu NÂNG CẤP đầy đủ khi nâng cấp các phiên bản PHP.


Dưới đây là một số thay đổi được nêu bật:

  • Đang gọi parent:: trong một lớp không có cha mẹ không được dùng nữa.
  • Đang gọi var_dump trên một DateTime hoặc DateTimeImmutable instance sẽ không còn để lại các thuộc tính có thể truy cập được trên đối tượng nữa.
  • openssl_random_pseudo_bytes sẽ ném một ngoại lệ trong các tình huống lỗi.
  • Cố gắng đăng tuần tự một PDO hoặc PDOStatement dụ sẽ tạo ra một Exception Thay vì một PDOException.
  • Đang gọi get_object_vars() trên một ArrayObject instance sẽ trả về các thuộc tính của ArrayObject chính nó chứ không phải các giá trị của mảng hoặc đối tượng được bao bọc. Lưu ý rằng (array) phôi không bị ảnh hưởng.
  • ext/wwdx đã không còn được dùng nữa.

# Cải tiến quy trình bỏ phiếu RFC

Về mặt kỹ thuật, đây không phải là bản cập nhật liên quan đến PHP 7.4, mặc dù điều đáng nói là: quy tắc bỏ phiếu cho RFC đã được thay đổi.

  • Họ luôn cần đa số 2/3 để vượt qua.
  • Không còn thời gian bỏ phiếu ngắn nữa, tất cả các RFC phải được mở trong ít nhất 2 tuần.



Leave a Comment

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *

Scroll to Top