0

Những tính năng mới và những cập nhật mới trong PHP 7

Phần 2: Những cập nhật mới trong PHP 7 so với các phiên bản 5x

Nới lỏng cú pháp đặt tên

PHP hiện tại có khoảng 64 từ dành riêng. Một số trong số chúng được hiểu như là các hàm hay là hằng số. Với những phiên bản PHP trước kia thì bạn không thể nào dùng một trong những bất kì từ nào trong số đó để đặt tên cho hằng số, tên lớp, tên hàm hay tên phương thức. Dùng chúng là tên biến thì nói chung là được tuy nhiên nó dễ gây ra sự nhầm lẫn. Tuy nhiên sang đến phiên bản PHP 7 thì bạn có thể dùng một cách linh hoạt hơn với những hàm có tên như trong danh sách trên. Ví dụ với phiên bản PHP 5x nếu như dùng:

class Collection {
    public function forEach(callable $callback) { /* */ }
    public function list() { /* */ }
}

PHP sẽ bắn ra lỗi

PHP Parse error: Syntax error, unexpected T_FOREACH, expecting T_STRING on line 2

PHP Parse error: Syntax error, unexpected T_LIST, expecting T_STRING on line 3

Trong PHP 7 chúng ta có thể dùng linh hoạt các hàm bằng cách tự định nghĩa nó trong class như sau:

class Collection extends \ArrayAccess, \Countable, \IteratorAggregate {

    public function forEach(callable $callback) {
        //...
    }

    public function list() {
        //...
    }

    public static function new(array $itens) {
        return new self($itens);
    }
}

Collection::new(['foo', 'bar'])->forEach(function($index, $item){
  /* callback */
})->list();

Thống nhất cú pháp biến

Sự thay đổi này mang đến cái nhìn trực quan về cách sử dụng biến trong PHP 7. Ví dụ về các biểu thức không hợp lệ trước đây, nhưng có hiệu lực với cú pháp biến thống nhất:

// hỗ trợ kết hợp các phép tính
$foo()['bar']()
[$obj1, $obj2][0]->prop
getStr(){0}

// hỗ trợ sự lồng nhau với ::
$foo['bar']::$baz
$foo::$bar::$baz
$foo->bar()::baz()

// hỗ trợ sự lồng nhau với ()
foo()()
$foo->bar()()
Foo::bar()()
$foo()()

// hỗ trợ các phép tính bất kì trong (...) của biểu thức
(...)['foo']
(...)->foo
(...)->foo()
(...)::$foo
(...)::foo()
(...)()

// hai ví dụ thực tế hay dùng
(function() { ... })()
($obj->closure)()

// hỗ trợ tất cả các phép tính vô hướng (phần này thường không hay dùng)
"string"->toLower()
[$obj, 'method']()
'Foo'::$bar

Ví dụ dưới đây chúng ta sẽ thấy rõ sự thay đổi của PHP7 so với phiên bản trước đó:

cách dùng trong PHP 5x Cách dùng trong PHP7
$$foo['bar']['baz'] ${$foo['bar']['baz']} ($$foo)['bar']['baz']
$foo->$bar['baz'] $foo->{$bar['baz']} ($foo->$bar)['baz']
$foo->$bar'baz' $foo->{$bar['baz']}() ($foo->$bar)'baz'
Foo::$bar'baz' Foo::{$bar['baz']}() (Foo::$bar)'baz'

Sửa lỗi trong foreach()

PHP vòng lặp foreach khi sử dụng con trỏ thì kết quả của cả quá trình đối với việc xử lý bằng PHP 5x thì không được hợp lý. Kể từ PHP 7 những lỗi phát sinh với foreach được sửa, làm cho các biểu thức sẽ có kết quả dễ nhận thấy và trực quan hơn nhiều so với phiên bản cũ. Ví dụ sau sẽ cho chúng ta hiểu hơn về quá trình này:

$array = [1,2,3];

foreach($array as &$val) {
    echo "{$val} - ", current($array), PHP_EOL;
}

// phiên bản trước PHP 7 cho kết quả:
1 - 2
2 - 3
3 -

// phiên bản PHP 7+ cho kết quả:
1 - 1
2 - 1
3 - 1

Loại bỏ cảnh báo date.timezone

Khi bất kì date- hoặc time- của một hàm cơ bản nào được gọi và giá trị mặc định của timezone không được set thì một cảnh báo sẽ được hiển thị lên. Đối với các phiên bản trước của PHP 7 thì việc sửa chữa chỉ đơn giản là thêm thiết lập giá trị mặc định cho date.timezone hợp lệ trong file cấu hình php.ini. Vấn đề này trong PHP 7 đã được gỡ bỏ và bạn không cần phải cấu hình mặc định cho file cấu hình nữa.

Loại bỏ sự tự định nghĩa lại các tham số trùng lặp

Với các phiên bản PHP 7 trở về trước thì việc đặt tham số trùng lặp và trả về kết quả của tham số thì hàm vẫn sẽ được thực thi, tuy nhiên từ phiên bản PHP 7 thì hàm sẽ không được thực thi và bắn ra lỗi như sau:

function foo($version, $version)
{
    return $version;
}

echo foo(5, 7);

// Trước PHP 7 kết quả là:
7

// PHP 7+ kết quả là:
Fatal error: Redefinition of parameter $version in /redefinition-of-parameters.php

Loại bỏ sự hỗ trợ mã HEX trong chuỗi số

String của hệ mã HEX không còn được công nhận là kiểu number trong PHP 7+ nữa, lý do được đưa ra là tạo ra tính nhất quán cho các sự truy xuất trong ngôn ngữ.

var_dump(is_numeric('0x123'));
var_dump('0x123' == '291');
echo '0x123' + '0x123';

// Trước PHP 7 kết quả là:
bool(true)
bool(true)
582

// PHP 7+ kết quả là:
bool(false)
bool(false)
0

Xét ví dụ trên ta thấy sự khá nhập nhằng giữa sự ép kiểu thành số nguyên và kiểm tra thuộc kiểu number. Nếu như:

var_dump((int) '0x123'); // int(0)
// chuỗi số hex phải mã hóa bằng `filter_var` thì mới cho ra kết quả như mong muốn
var_dump(filter_var('0x123', FILTER_VALIDATE_INT, FILTER_FLAG_ALLOW_HEX)); // int(291)

Thay đổi giá trị trả về của hàm substr()

substr() will now return an empty string instead of false when the start position of the truncation is equal to the string length: trong PHP 7+ thì substr() trả về giá trị rỗng thay vì fasle như trước kia khi mà cắt chuỗi với giá trị bằng đúng độ dài của chuỗi.

var_dump(substr('a', 1));

// Trước PHP 7 kết quả là:
bool(false)

// PHP 7+ kết quả là:
string(0) ""

Tài liệu tham khảo

Tài liệu PHP7 PHP7-Reference


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí