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é
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
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]));
<?php $username = $_GET['user'] ?? 'nobody'; // Có thể được dùng thay thế cho $username = isset($_GET['user']) ? $_GET['user'] : 'nobody';]));
<?php // Integers echo 1 <=> 1; // 0 echo 1 <=> 2; // -1 echo 2 <=> 1; // 1
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};
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
Đố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); }
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; }
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; }
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
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
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; }
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.
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 function test($a,$b){ } test(1,2,);
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
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; }
<?php $factor = 10; $nums = array_map(fn($n) => $n * $factor, [1, 2, 3, 4]); // $nums = array(10, 20, 30, 40); ?>
<?php $a ??= new DateTime(); //thay vì $a = $a ?? new DateTime();
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
Chi tiết so sánh có thể tham khảo https://stitcher.io/blog/php-preload-benchmarks
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;
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
+ 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!
Bình luận: