Code Tu Tam

Một số cải tiến cơ bản trong PHP từ bản PHP 5 tới PHP 8 (P2)

Rate this post

Trong phần trước chúng ta đã tìm hiểu thay đổi cơ bản của PHP và dừng lại ở phiên bản PHP 5.6. Những thay đổi này bản chất theo CodeTuTam bất kì lập trình viên PHP nào cũng nên biết. Điều này không chỉ giúp chúng ta luôn luôn làm mới kiến thức mà còn giúp chúng ta gia tăng hiệu suất, thay đổi những các làm việc cũ bằng cách làm việc mới hiệu quả hơn.

Và trong phần này hãy cùng nhau tìm hiểu những thay đổi trong các phiên bản PHP 7 nhé

Phiên bản PHP 7.0

Tốc độ là điều đầu tiên phải nói đến, khi mà PHP 7.0 được nói rằng có thể đạt tốc độ nhanh hơn gấp 2 lần so với PHP 5.6

Định nghĩa kiểu dữ liệu trả về

Trước giờ việc định nghĩa kiểu dữ liệu trả về chỉ tồn tại trong các ngôn ngữ dạng như C, C#, Java… và đây là lần đầu tiên xuất hiện trong PHP

<?php

function arraysSum(array ...$arrays): array
{
    return array_map(function(array $array): int {
        return array_sum($array);
    }, $arrays);
}

print_r(arraysSum([1,2,3], [4,5,6], [7,8,9]));

Toán tử kiểm tra Null (Null coalescing operator)

<?php
$username = $_GET['user'] ?? 'nobody';
// Có thể được dùng thay thế cho
$username = isset($_GET['user']) ? $_GET['user'] : 'nobody';]));

Toán tử so sánh 2 chiều (Spaceship operator)

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

Use group các class

Trước PHP 7 việc use nhiều class sẽ làm code khá dài và tốn nhiều diện tích, điều này đã được cập nhật trong bản PHP 7

<?php
// Pre PHP 7 code
use some\namespace\ClassA;
use some\namespace\ClassB;
use some\namespace\ClassC as C;

use function some\namespace\fn_a;
use function some\namespace\fn_b;
use function some\namespace\fn_c;

use const some\namespace\ConstA;
use const some\namespace\ConstB;
use const some\namespace\ConstC;

// PHP 7+ code
use some\namespace\{ClassA, ClassB, ClassC as C};
use function some\namespace\{fn_a, fn_b, fn_c};
use const some\namespace\{ConstA, ConstB, ConstC};

Deprecate việc khai báo tên hàm trùng tên class

Có lẽ chúng ta đã không lạ lẫm gì việc khai báo hàm khởi tạo trong PHP

<?php
//Cách 1
class CodeTuTam{
    public function CodeTuTam(){}
}

// Cách 2
class CodeTuTam1{
    public function __construct(){}
}

Tuy vậy từ PHP 7.0 việc sử dụng tên hàm trùng tên class sẽ bị Deprecate một thay đổi nhỏ nhưng cũng rất đáng lưu ý cho các bạn mới bước vào lập trình php

Ngoài ra còn có một số thay đổi khác như: Anonymous classes, Khai báo constant dạng array …. các bạn tham khảo thêm tại https://www.php.net/manual/en/migration70.new-features.php

 

PHP phiên bản 7.1

Kiểu dữ liệu có thẻ null (Nullable Type)

Đối với tham số và dữ liệu trả về từ phiên bản 7.1 có thể khai báo rằng dữ liệu có thể bị null

<?php

function testReturn(): ?string
{
    return 'elePHPant';
}

function test(?string $name)
{
    var_dump($name);
}

Kiểu dữ liệu trả về là dạng void

Function dạng void đã tồn tại gần như ngay từ đầu với các đại đa số các ngôn ngữ lập trình khác, tuy vậy kể từ PHP 7.1 điều này sẽ chính thức được áp dụng.

Điều này giúp cho PHP trở nên chặt chẽ hơn. Nếu 1 function được khai báo kiểu trả về là void, mà chúng ta vẫn cố tình return giá trị thì sẽ nhận được Exception cảnh báo.

<?php
function swap(&$left, &$right): void
{
    if ($left === $right) {
        return;
    }

    $tmp = $left;
    $left = $right;
    $right = $tmp;
}

Tính đóng gói cho class constant

Mặc định các phiên bản trước đây điều này là không thể, bản thân mình hồi đầu cũng thử khai báo nhưng đều bị báo lỗi, điều này khắc phục trong bản PHP 7.1

<?php
class ConstDemo
{
    const PUBLIC_CONST_A = 1;
    public const PUBLIC_CONST_B = 2;
    protected const PROTECTED_CONST = 3;
    private const PRIVATE_CONST = 4;
}

Phép cộng string với số, string và string sẽ không được phép

Trong PHP nối chuỗi thường sử dụng bằng dấu “.” tuy vậy trong 1 số ngôn ngữ khác như C#, Java thì thường là dấu +. Chính điều này có thể gây ra 1 số cản trở khi một lập trình viên làm nhiều ngôn ngữ

PHP 7.1 với cảnh báo cộng không hợp lệ này đã hạn chế phần nào sự nhầm lẫn này

<?php
echo "1"+"2"; //3
echo "1"+ "hello"; // error
echo "hi "+ "Code Tu Tam";// error

 

 

PHP version 7.3

Kiểu đối tượng object mới

object được giới thiệu cho nhằm chỉ định cho việc dữ liệu truyền vào hoặc dữ liệu trả về là 1 đối tượng bất kì

<?php

function test(object $obj) : object
{
    return new SplQueue();
}

test(new stdClass); // Phiên bản PHP trước 7.2 sẽ lỗi
test(new stdClass); // PHP 7.2 trở đi -> ok
test(""); // Lỗi vì string không phải là đối tượng

Ghi đè phương thức trừu tượng

Hàm trừu tượng có thể bị ghi đè lại trong class kế thừa, việc này khá ữu ích với việc mở rộng class

<?php

abstract class A
{
    abstract function test(string $s);
}
abstract class B extends A
{
    abstract function test($s) : int;
}

Mã hóa mật khẩu mới: Argon2 , cũng được sử dụng từ Laravel 5.6

Với Argon2 sẽ đem lại hiệu năng về bộ nhớ cũng như thời gian tốt hơn rất nhiều so với bcrypt hiện tại.

Tốc độ xử lý vượt trội

Theo 1 cách nói thì chỉ cần nâng cấp PHP version lên 7.2 thì tốc độ xử lý của mã nguồn đã thay đổi rất nhiều.

Với PHP 7.2 tốc độ xử lý gấp 400 lần 5.2 và 3 lần 5.6

 

PHP 7.3 cập nhật cùng 1 số thay đổi nhỏ

Cho phép dấu phẩy trong gọi hàm

<?php

function test($a,$b){
    
}
test(1,2,);

 

Function is_countable

Trước đây để kiểm tra biến có thể count được hay không chúng ta phải check is_array và instanceof Countable nhưng giờ có thể thay đổi điều này:

<?php
class CountMe implements Countable
{

    protected $count = 3;

    public function count()
    {
        return $this->count;
    }

}

$foo =new CountMe;
if(is_array($foo) || $foo instanceof Countable){
    echo count($foo);//3
}
if(is_countable($foo)){
    echo count($foo);//3
}

Hàm array_key_first và array_key_last

Tốc độ xử lý của PHP 7.3 được đưa ra là nhanh hơn 31% so với  PHP 7.0

Phiên bản PHP 7.4, phiên bản cuối cùng của PHP 7

Khai báo kiểu dữ liệu của biến

Tính năng này cá nhân mình rất chờ đợi, nhưng phải đợi đến PHP 7.4 điều này mới xuất hiện

<?php
class B{
    
}
class A{
    public int $a;
    public B $b;
}

Arrow Function

<?php
$factor = 10;
$nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]);
// $nums = array(10, 20, 30, 40);
?>

Toán tử gán Null

<?php
$a ??= new DateTime(); 
//thay vì 
$a = $a ?? new DateTime();

Cơ chế Preloading

Giúp PHP tăng tốc vượt bậc với cơ chế Preloading

Như đã biết thì PHP phát triển dựa trên nền C, nên trong các framework PHP được biết đến thì Phalcon có tốc độ xử lý tuyệt vời nhất. Khoảng cách giữa Phalcon với các framework khác là vô cùng lớn. Điều này sẽ được thay đổi với cơ chế Preloading

Trước đây sử dụng opcache để tối ưu, tuy vậy việc opcache vẫn cần tìm kiếm file cache đã tồn tại. Với Preloading sẽ load PHP như 1 thư viện mặc định của hệ thống. Nhanh khoảng 25 – 30% so với trước đây
Việc Preloading giống như server sẽ nạp sẵn các thư viện PHP ( mà chúng ta đã chỉ định), các thư viện này sẽ mặc định tồn tại mà không kiểm tra.

Hạn chế của việc này là chỉ áp dụng được trên VPS, Server. Và việc Preload trước nếu trên 1 server mà có nhiều loại mã nguồn, hoặc nhiều phiên bản khác nhau có thể dẫn đến việc xung đột class, function . Việc này chỉ tối ưu nhất khi trên server/vps đó chỉ có 1 website mà thôi

So sánh hiệu năng của Preloading (Request Per Second )

Chi tiết so sánh có thể tham khảo https://stitcher.io/blog/php-preload-benchmarks

PHP 8 – Big change của PHP

Union Types

Kiểu dữ liệu cho tham số và dữ liệu trả về có thể là nhiều kiểu khác nhau

public function foo(Foo|Bar $input): int|float;

 

JIT – Just in time

Khi nói đến PHP chúng ta thường nghĩ ngay đến việc lập trình web. Thì việc JIT ra đời giúp PHP có thể thực hiện các tác vụ liên quan tới nhiều tính toán, xử lý hơn, cái mà khi đó cần tới hiệu năng của CPU, GPU.

Theo như The PHP đưa ra thì dưới đây là 1 số lý do mà chúng ta đc tiếp cận tới JIT. Xem thêm tại https://wiki.php.net/rfc/jit

Thực ra trước đây vào khoảng năm 2015 đã từng có 1 bản jit được thử nghiệm và có thể đưa lên PHP 7, tuy nhiên sau đó đã ngừng lại.

Lý do 1: PHP gần như đã đạt đến hiệu năng tối đa có thể, và JIT là giải pháp bắt buộc tiếp theo để nâng cao hiệu suất của PHP

Lý do 2: Với JIT, mở ra các cơ hội sử dụng PHP trong các nghiệp vụ chức năng khác (không phải web), các nghiệp vụ cần tới xử lý nhiều bằng CPU – điều mà hiện nay PHP không được đánh giá cao.

Lý do cuối cùng: cùng với JIT thì đội ngũ phát triển có thể mở rộng thêm các hàm mở rộng cho PHP mà có thể hạn chế/ hoặc không cần sử dụng tới C mà không tạo ra sự ảnh hưởng hay chênh lệch hiệu suất, đồng thời hạn chế được những lỗi liên quan tới bộ nhớ hoặc các vấn đề khác nếu sử dụng C

Zeev, một trong các lập trình viên core của PHP đã mô tả sự thay đổi này thông qua video nói về render hình ảnh với PHP JIT

 Một số thay đổi khác trong PHP8:

+ Hàm str_contains để kiểm tra 1 chuỗi có nằm trong 1 chuỗi khác

+ Attributes – giống với annotations trong Java

+ Stringable  Interface

….

Trên đây là tóm tắt những sự thay đổi, cải tiến cũng như big change của PHP qua từng phiên bản. Hi vọng với bài viết này sẽ giúp các bạn có một cái nhìn tổng quan về việc hình thành và phát triển PHP cũng như tiềm năng phát triển của PHP trong tương lai sắp tới

Xem thêm bài viết sự các cải tiến trong PHP 5 đến PHP 8 Phần 1

Bài viết dựa trên kiến thức cá nhân và tổng hợp, không tránh khỏi có sự sai sót mong các bạn góp ý cho bài viết!

Exit mobile version