PHP 7 có gì mới

Như chúng ta biết sau nhiều năm phát triển thì cuối cùng PHP 5.x cũng đã được cải tiến nhiều tính năng mới sẽ đựoc tích hợp trong PHP 7, trong bài viết này tôi sẽ giới thiệu những tính năng mới có trong PHP 7 cũng như liệt kệ những tính năng các phiên bản PHP củ không còn dùng trong PHP7. Có một thông tin thú vị là không có phiên bản PHP 6 có nhiều lý do tranh luận , bạn có thể xem tại đây để hiểu rõ hơn.

Hằng số

Trong phiên bản PHP5.x bạn không thể khai báo một defined với một mảng, nhưng trong phiên bản mới này bạn có thể làm điều đó được:

//work on php7
define('FOO', [
'bar' => 'baz',
'bat' => 'qux'
]);
echo FOO['bar'];

Loại bỏ PHP 4 Constructors

Như chúng ta biết trong phiên bản PHP 4 để chạy một thuộc tính nào đó khi vừa khởi tạo chưong trình ta khai báo tên phương thức khỏi tạo đó giống với tên
của class name đó, nhưng bắt đầu từ phiên bản PHP 7.x tính năng đó đang xem xét loại bõ, hiện tại nó vẫn chưa loại bỏ, trong phiên bản PHP 8.x nó sẽ
loại bỏ hoàn toàn

class Filter {

// PHP 5: filter is a constructor
// PHP 7: filter is a constructor and E_DEPRECATED is raised
// PHP 8: filter is a normal method and is not a constructor; no E_DEPRECATED is raised
function filter($a) {}
}

$filter = new ReflectionMethod('Filter', 'filter');

// PHP 5: bool(true)
// PHP 7: bool(true)
// PHP 8: bool(false)
var_dump($filter->isConstructor());

Thây thế thành phần mở rộng json thành jsond

Hiện tại thì gói mở rộng json trên Linux chưa phải là miển phí đối với một số bản phân phối Linux, đều đó có nghĩa là sẽ không có thành phần mở rộng json mặc định trong các bản phân phối
Linux, do đó sẽ dãn đến một số lỗi trong qua trình cài đặt các thành phần mở rộng của PHP, chẳn hạn như Phalcon, bạn có thể xem tại đây.
Tôi không có ý kiến gì cho vấn đề này , như mọi khi free luôn là tốt nhất trong mã ngồn mở 🙂

So sánh sự kết hợp của các toán tử với nhau

Trong phiên bản PHP 7 có thêm một toán tử mới là (exp)<=>(exp), nó sẽ trả về 0 nếu hai biểu thức là bằng nhau, bằng 1 nếu biểu thức bên trái của toán tử lớn hơn bên phải và ngựợc lài sẽ là -1. Nó sữ dụng lại đúng những quy tắc toán tử của các phiên bản PHP trước bạn có thể xem rõ ở đây. Ta hãy xem xét ví dụ dưói đây để hiểu rõ hơn:

|operator | <=> equivalent |
|——|:——————|
$a < $b  | $a <=> $b) === -1
$a <= $b | ($a <=> $b) === -1 || ($a <=> $b) === 0
$a == $b | ($a <=> $b) === 0
$a != $b | ($a <=> $b) !== 0
$a >= $b | ($a <=> $b) === 1 || ($a <=> $b) === 0
$a > $b  | ($a <=> $b) === 1

// Integers
echo 1 <=> 1; // 0
echo 1 <=> 2; // -1
echo 2 <=> 1; // 1

// Objects
$a = (object)
- a" => "b;
$b = (object)
- a" => "b;
echo $a <=> $b; // 0

tính năng trên thường sử dụng trong các việc sử dụng các hàm sorting callbacks, bạn hãy xem ví dụ bên dưới để thấy code nó đẹp như thế nào:

// Pre Spacefaring^W PHP 7
function order_func($a, $b) {
return ($a < $b) ? -1 : (($a > $b) ? 1 : 0);
}

// Post PHP 7
function order_func($a, $b) {
return $a <=> $b;
}

Xem đầy đủ tính tính năng của nó tại đây. Kế đến ta sẽ review tính năng kiểu dữ liệu trả về:

Kiểu dữ liệu trả về:

Trong ngôn ngũ lập C một function luôn trả về một kiểu dữ liệu, và trong phiên bản PHP 7 này nó đã có tính năng đó, và thật sự tôi rất thích tính năng này, nó giúp code của ta trở nên chặt chẽ hơn về mặt dữ liệu cũng như hiển thị báo lỗi rõ ràng hơn, vậy nó là một cải tiến chăng ? vâng nó là một cải tiến, nhưng nó là hoàn hảo ? không may thây nó chưa thực sự hoàn hảo. hãy để tôi chỉ ra đều đó:

  • Kiểu dữ liệu trả về hiện nay chỉ trả về một kiểu, hàm khởi tạo constructor cũng như hàm hũy và phương thức clone  chưa có kiểu dữ liệu trả về.


  • Không có nhiều kiểu dữ liệu trả về, điều này có nghĩa là khi trong 1 function bạn muốn trả về giá trị bool|string nó sẽ không làm việc, tôi huy vọng trong phiên bản kế tiếp sẽ có tính năng này
function getSomeData($a): bool|string
{
if ($a == false) {
return false;
}
return "error";
}

Nếu bạn nào có dùng Zephir thì dòng code ở trên sẽ không báo lỗi:

//Zephir languagess
function getSomeData(a) -> string|bool
{
if a == false {
return false;
}
return "error";
}

Một vài người không thích cách khai báo kiểu giá trị nằm sau function, họ cho rằng đều đó không giống khai báo như C, nhưng tôi nghĩ đều đó không cần thiết vì đa số hầu hêt trong ngôn ngữ lặp trình hiện đại C++, Zephir, HHVM đều sử dụng cú pháp giống vậy. Vì vậy tôi nghĩ đây là điểm cộng trong phiên bản PHP 7 này, thế còn ý kiến bạn thế nào ?

Kiểu dữ liệu void

Như chúng ta biết Void không phải là kiểu dữ liệu hơp lệ, nó được xem như là 1 kiểu dữ liệu giả(Pseudo-types) và nó thường dùng để mô tả chức năng của một function trong phần chú thích(docblock)

Void !== Null

Khái niệm trả về Void trong function PHP là một cái gì đó mơ hồ, thực sự tôi sẽ rất vui mình nếu PHP 7 có tính năng này

function nothin(): void {
// Do something exciting
return;
}

function nothinElse(): void {
// Do something else exciting
}

Nhưng không may thây , cộng đồng RFC PHP chưa đồng ý với  tính năng này, nhưng bạn cũng có thể dùng nó nếu bạn muốn, bạn có thể pull nó tại đây https://github.com/php/php-src/pull/1084

Bỏ qua các tham số tùy chọn khi khai báo trong function

Trong PHP một hàm với các tham số thường có dạng như sau:

function create_query($where, $order_by, $join_type='', $execute = false, $report_errors = true)
{...}

Nếu chúng ta luôn sữ dụng mặt định của các tham số thì không sao cả, nhưng chuyện gì sẽ xảy ra nếu chúng ta thây đổi giá trị tham số $repport_errors mà chúng ta không quan tâm đến các tham
số khãc còn lại trong hàm đó, cho tới lúc này cộng đồng RFC PHP có đề xuất nhiều ý tưởng cho vấn đề này, tôi sẽ cập nhật tính năng đó sau khi có sự thông nhất của cộng đồng này.

Fibonacci(40) benchmark

Để kiểm tra hiệu suất về tốc độ tôi sẽ chạy chương trình tính toán dãy số Fibonacci trên 2 phiên bản PHP 5.5.6 và PHP 7.0 trên HĐH Fedora với thông tin phần cứng nhau sau:

Architecture:          i686
CPU op-mode(s):        32-bit, 64-bit
Byte Order:            Little Endian
CPU(s):                4
On-line CPU(s) list:   0-3
Thread(s) per core:    2
Core(s) per socket:    2
Socket(s):             1
Vendor ID:             GenuineIntel
CPU family:            6
Model:                 60
Model name:            Intel(R) Core(TM) i3-4150 CPU @ 3.50GHz
Stepping:              3
CPU MHz:               3494.394
CPU max MHz:           3500.0000
CPU min MHz:           800.0000
BogoMIPS:              6983.88
Virtualization:        VT-x
L1d cache:             32K
L1i cache:             32K
L2 cache:              256K
L3 cache:              3072K

Và chương trình Fibonacci php như sau:

 function fibonacci($n) {
if ($n < 2) { return $n; } return fibonacci($n - 2) + fibonacci($n - 1); } echo fibonacci(40)."\n"; ?>

Để kiểm tra thời gian thực thi chương trình nó bạn chỉ cần chạy lệnh sau:

  • Kết quả phiên bản PHP 5.5.6
$ time php fibonaci.php
102334155

real    0m43.197s
user    0m42.246s
sys    0m0.014s

  • Kết quả phiên bản PHP 7.0
$ time php7.0 fibonaci.php
102334155

real    0m11.912s
user    0m11.565s
sys    0m0.006s

Như bạn thấy thì PHP 7.0 chạy nhanh hơn phải không, đây chỉ là ví dụ kiểm tra đơn giản, ngoài ra ta có thể kiểm tra thông qua đoạn mã từ Zend ở đây, hoặc bạn cũng có thể tham khảo kết quả ơ đây

  • Kết quả phiên bản PHP 7.0
$ php7.0 ../Zend/bench.php
simple             0.028
simplecall         0.014
simpleucall        0.023
simpleudcall       0.028
mandel             0.088
mandel2            0.107
ackermann(7)       0.027
ary(50000)         0.005
ary2(50000)        0.004
ary3(2000)         0.059
fibo(30)           0.099
hash1(50000)       0.012
hash2(500)         0.011
heapsort(20000)    0.030
matrix(20)         0.029
nestedloop(12)     0.048
sieve(30)          0.018
strcat(200000)     0.005
------------------------
Total              0.636

  • Kết quả phiên bản PHP 5.5.6
$ php ../Zend/bench.php
simple             0.076
simplecall         0.114
simpleucall        0.117
simpleudcall       0.118
mandel             0.170
mandel2            0.229
ackermann(7)       0.107
ary(50000)         0.015
ary2(50000)        0.015
ary3(2000)         0.149
fibo(30)           0.380
hash1(50000)       0.029
hash2(500)         0.033
heapsort(20000)    0.068
matrix(20)         0.070
nestedloop(12)     0.108
sieve(30)          0.081
strcat(200000)     0.013
------------------------
Total              1.896

Kết luận

Tôi rất phấn khởi về tương lai của PHP 7, mặc dù vẫn còn có nhiều vấn tính năng gây tranh cãi trong cộng đồng PHP, nhưng tôi hy vọng rằng nó có thể được giải quyết và chúng ta có thể chơi với các chức năng mới trong các phiển bản bỗ xung của PHP 7, bởi vì cho đến nay PHP 7 trông thật sự tuyệt vời không chỉ là về tốc độ mà cả về sự chặc chẽ trong cách viết code.

Trong bài này tôi đã cho bạn một cái nhìn tổng quát về PHP 7 và trong bài kế tiếp tôi sẽ trình bày thêm tính năng khác nữa mà tôi tin chắc là bạn sẽ cần nó. Bạn đã dùng PHP 7 chưa nếu có hãy chia sẽ những tính năng mà bạn biết với chúng tôi, như thường lệ hãy chia sẽ bài viết này nếu bạn thấy hay :).

This entry was posted in PHP and tagged .

Leave a Reply

Your email address will not be published. Required fields are marked *