/ php

PHP 7.2 có gì mới?

Phiên bản PHP 7.2 được chính thức ra mắt vào ngày 30 tháng 11 năm 2017 giới thiệu một số hàm mới, cải thiện hiệu năng và cách viết tốt hơn. Trong bài viết này mình sẽ giới thiệu một số điểm nổi bật của phiên bản này.

Core Improvements

Argument type declarations

Kể từ phiên bản PHP 5 đã cho phép chúng ta ràng buộc kiểu dữ liệu của các tham số (Gọi là Argument type declarations hoặc là Type hints) để khi các tham số ràng buộc truyền vào không đúng kiểu sẽ xuất hiện lỗi.

Đây là một ví dụ:

class FooBar {
	public $testVar = 'Hello World';
}

$fooBar = new FooBar;

function test(FooBar $fooBar) {
	return $fooBar->testVar;
}

echo test($fooBar);

Trong ví dụ trênn, nếu hàm test có tham số nhận vào không phải là một instance của lớp FooBar. Thì kế quả lỗi sẽ trả về như sau:

Fatal error: Uncaught TypeError: Argument 1 passed to test() must be an instance of FooBar, string given, called in /index.php on line 12 and defined in /index.php:8

Kể từ PHP 7.2 type hints có thể sử dụng kiểu object để ràng buộc kiểu tham số là một đối tượng cho hàm hoặc phương thức. Ví dụ:

class Sample {
	public $test = '';
}

class FirstChild extends Sample {
	public $test = 'My name is Tracy';
}
class SecondChild extends Sample {
	public $test = 'My name is Henry';
}

$firstchild = new FirstChild;
$secondchild = new SecondChild;

function test(object $arg) {
	return $arg->test;
}

echo test($firstchild);

echo test($secondchild);

Object return type declarations

Tương tự như trên, phiên bản này của PHP cho phép sử dụng object để ràng buộc kiểu dữ liệu trả về của một hàm hoặc phương thức của một lớp, ví dụ:

class Sample {
	public $test = 'Hello World';
}

$sample = new Sample;

function test(Sample $sample) : object {
	return $sample;
}

echo test($sample)->test;

Parameter Type Widening

Trước đây, PHP không cho phép các lớp con kế thừa thay đổi kiểu dữ liệu của tham số tức là phải ràng buộc giống như lớp cha, ví dụ:

<?php
class MyClass {
	public function myFunction(array $myarray) { /* ... */ }
}

class MyChildClass extends MyClass {
	public function myFunction($myarray) { /* ... */ }
}

Lúc này sẽ nhận được một cảnh báo như sau:

Warning: Declaration of MyChildClass::myFunction($myarray) should be compatible with MyClass::myFunction(array $myarray) in %s on line 8

Kể từ phiên bản PHP 7.2 bạn có thể thay đổi kiểu ràng buộc để mở rộng phương thức.

Xem thêm 'Trailing commas in list syntax' (Cú pháp dấu phẩy cuối)

Security Improvements

Argon2 in password hash

Argon2 là một thuật toán mã hóa một chiều mạnh mẽ từng được chọn vào năm 2015 trong một cuộc thi về thuật toán mã hóa, và PHP 7.2 đã chọn và đem nó vào thay cho thuật toán Bcrypt trước đó.

Phiên bản PHP giới thiệu hằng số PASSWORD_ARGON2I, có thể sử dụng trong các hàm password_*:

password_hash('password', PASSWORD_ARGON2I);

Không giống như Bcrypt chỉ có một hệ số thì Argon2 cung cấp đến 3 hệ số để thay đổi:

  • Hệ số memory giá trị được tính bằng KiB chỉ giới hạn bộ nhớ tiêu thụ trong lúc mã hóa (Giá trị mặt định là 1<<10, hay 1024 KiB, hay 1 MiB)
  • Hệ số time số lần thuật toán chạy (Giá trị mặc định là 2)
  • Hệ số threads, chỉ số luồng chạy mã hóa song song (Giá trị mặc định là 2)

Kèm với đó là 3 hằng số để giá trị mặc định của 3 hệ số trên:

  • PASSWORD_ARGON2_DEFAULT_MEMORY_COST
  • PASSWORD_ARGON2_DEFAULT_TIME_COST
  • PASSWORD_ARGON2_DEFAULT_THREADS

Ví dụ:

$options = ['memory_cost' => 1<<11, 'time_cost' => 4, 'threads' => 2];
password_hash('password', PASSWORD_ARGON2I, $options);

Xem thêm Argon2 Password Hashing.
Xem thêm Libsodium as part of PHP Core

Deprecations

Dưới đây là danh sách các hàm và tính năng được ngừng sử dụng ở PHP 7.2 và sẽ loại bỏ trong phiên bản PHP 8.0:

  • __autoload được thay thế bởi spl_autoload_register.
  • Biến $php_errormsg được tạo ra trong khu vực khi có lỗi xuất hiện. Từ PHP 7.2 dùng hàm error_get_last()error_clear_last() thay vì biến trên.
  • create_function() cho phép tạo ra một hàm với tên và các tham số nhưng kém bảo mật và ảnh hưởng đến hiệu suất vì thế đã đề nghị ngừng sử dụng tại phiên bản 7.2
  • each() tương tự foreach nhưng foreach cho tốc độ gấp 10 lần.
  • ...

Conclusions

Bạn đã sẵn sàn nâng cấp lên phiên bản mới của PHP chưa? Ngoài các tính năng mới đồng thời cải thiện về mặt hiệu năng, bảo mật và cách viết code, hi vọng bài này sẽ giúp bạn phần nào tiếp cận phiên bản mới của PHP. Để tham khảo thêm bạn có thể xem các link mình đính kèm bên dưới.

Tham khảo: release announcement hoặc changelog.

Đinh Quốc Hân

Đinh Quốc Hân

Mình rất yêu thích việc lập trình web, đam mê việc nghiên cứu, tạo ra các sản phẩm có ích cho bản thân và cộng đồng

Read More
PHP 7.2 có gì mới?
Share this

Subscribe to Dinh Quoc Han