12/08/2018, 13:45

Một số thay đổi trong phiên bản PHP 7.1 sắp tới

Dưới đây là một số thay đổi sẽ được giới thiệu (hoặc loại bỏ) trong PHP 7.1: Catch cùng lúc nhiều exceptions. Bổ từ truy cập cho các class constants. Nullable types. Void return type. Negative string offsets. Cho phép keys xác định trong hàm list(). Destruct mảng với cú pháp ...

PHP 7_1.png

Dưới đây là một số thay đổi sẽ được giới thiệu (hoặc loại bỏ) trong PHP 7.1:

  • Catch cùng lúc nhiều exceptions.
  • Bổ từ truy cập cho các class constants.
  • Nullable types.
  • Void return type.
  • Negative string offsets.
  • Cho phép keys xác định trong hàm list().
  • Destruct mảng với cú pháp ngoặc vuông.
  • Cảnh báo khi sử dụng string không hợp lệ trong tính toán.
  • Deprecate và loại bỏ hàm mcrypt().

Trong một số trường hợp tôi thường handle nhiều exceptions khác nhau cùng một cách, kết quả là code bị trùng lặp:

<?php
try {
   // ...
} catch (ExceptionType1 $e) {
   // Code dùng để handle exception
} catch (ExceptionType2 $e) {
   // Cùng một code để handle exception
} catch (Exception $e) {
   // ...
}

Từ phiên bản PHP 7.1, hai exeptions có thể được handle cùng một cách và được catch cùng một lúc:

<?php
try {
   // ...
} catch (ExceptionType1 | ExceptionType2 $e) {
   // Code để handle 2 exceptions cùng lúc
} catch (Exception $e) {
   // ...
}

Hiện tại class contants không thể để private hay protected, chúng mặc định là public:

<?php

class Token {
	// Constants mặc định là public
	const PUBLIC_CONST = 0;
}

PHP 7.1 hộ trợ bổ từ truy cập cho các constants:

<?php

class Token {
	// Constants mặc định là public
	const PUBLIC_CONST = 0;

    // Constants có thể được định nghĩa với bổ từ truy cập
    private const PRIVATE_CONST = 0;
    protected const PROTECTED_CONST = 0;
    public const PUBLIC_CONST_TWO = 0;

    // Có thể định nghĩa nhiều constants với cùng 1 bổ từ truy cập 1 lúc
    private const FOO = 1, BAR = 2;
}

# Nullable types
Khai báo kiểu trả về được thêm vào phiên bản PHP 7.0. Điều này cho phép các developers có thể khai báo chính xác kiểu trả về từ một hàm:

```php

<?php
function add($a, $b) : float {
    return $a + $b;
}

Với khai báo hàm như trên bạn chỉ có thể trả về kiểu float, đôi khi bạn vẫn muốn trả về giá trị null hoặc một kiểu dữ liệu xác định khác, ở PHP 7.1 bạn có thể làm được điều này:

<?php
function answer(): ?int  {
    return null;
}

Ở phiên bản PHP 7.1 bạn còn có thể khai báo các hàm trả về kiểu dữ liệu void, nó thực hiện một hành động nhưng không trả về gì cả:

<?php
function dont_return_anything(): void {
    return;
}

Trong hầu hết các functions trong PHP cung cấp một negative string offsets có nghĩa là 'vị trí n đếm ngược từ cuối chuỗi'. Cơ chế này được sử dụng rộng rãi nhưng không may, những giá trị âm này không được hỗ trợ mọi nơi. Vì vậy, các PHP developer có thể không dễ dàng biết liệu một chuỗi chức năng cho chấp nhận các giá trị âm hay không, họ thường xuyên cần phải tham khảo tài liệu. Nếu không, họ cần phải sử dùng hàm substr(), làm cho code của họ khó đọc và chậm hơn.

Một ví dụ rõ ràng là strrpos() chấp nhận offset âm, trong khi strpos() thì không. Cùng với substr_count() không chấp nhận offset âm hoặc length, trong khi substr() chấp nhận chúng.

Truy cập vào một ký tự của một chuỗi sử dụng một '{}' hoặc '[]' sẽ được mở rộng đến các giá trị âm:

<?php
$str='abcdef';
var_dump($str[-2]); // => string(1) "e"

$str{-3}='.';
var_dump($str);		// => string(6) "abc.ef"

var_dump(isset($str{-4}));	// => bool(true)

var_dump(isset($str{-10}));	// => bool(false)

Hiện tại chúng ta có thể chuyển một mảng thành một danh sách các biến sử dụng hàm list():

<?php
$myArray = ['monkey', 'tree', 'banana'];
list($monkey, $tree, $banana) = $myArray;

Hàm list chỉ làm việc với các mảng có index bằng số bắt đầu từ 0 như ví dụ trên. Nó không làm việc được với mảng có các keys xác định như thế này:

<?php
$myNamedArray = [
    'name' => 'Amo',
    'age' => 32',
    'location' => 'London'
];

Nhưng PHP 7.1 đã giải quyết việc này:

<?php
list('name', 'age', 'location') = $myNamedArray;
// hoặc
list("name" => $name, "age" => $age, "location" => $location) = $myNamedArray;

PHP 7.1 cung cấp một cú pháp mới để destruct một mảng tương tự với hàm list() như sau:

<?php

// Hai dòng trong mỗi cặp sau là tương đương với nhau

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

list("a" => $a, "b" => $b, "c" => $c) = array("a" => 1, "b" => 2, "c" => 3);
["a" => $a, "b" => $b, "c" => $c] = ["a" => 1, "b" => 2, "c" => 3];

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

Tính năng này sẽ cho phép chúng ta có E_NOTICE hoặc E_WARNING mỗi khi một chuỗi được sử dụng trong bất kỳ một phép tính như thế này:

<?php

$numberOfApples = "10 apples" + "5 pears";

Trong trường hợp bạn làm điều này, lỗi như sau sẽ được throw:

Notice: A non well formed numeric string encountered in example.php on line 3
Notice: A non well formed numeric string encountered in example.php on line 3

Hoặc nếu bạn làm điếu này:

<?php

$numberOfPears = 5 * "orange";

Bạn nhận được các cảnh báo sau đây:

Warning: A non-numeric string encountered in example.php on line 3

Thư viện Mcrypt đã bị bỏ quên vào năm 2007 và chứa nhiều lỗi và vá lỗi chưa được merged. Vì vậy, việc nó đã được xem xét lại.

Trong PHP 7.1, tất cả các functions mcrypt_* sẽ đưa ra cảnh báo E_DEPRECATED. Trong PHP 7.1 + 1 nó sẽ được loại bỏ hoàn toàn.

Bạn có thể tham khảo toàn bộ thay đổi hoặc những thay đổi đang được bàn luận tại PHP RFC.

0