Khi một số tính năng mới được thêm vào với mỗi phiên bản mới, một số tính năng cũng bị loại bỏ vì chúng được coi là lỗi thời. Trong chương này, chúng ta sẽ xem xét các tính năng đã bị ngừng hỗ trợ sau phiên bản PHP 5.
Các phương thức khởi tạo theo kiểu PHP 4 có cùng tên với lớp mà chúng được định nghĩa trong đó hiện đã bị lDeprecated và sẽ bị loại bỏ trong tương lai. PHP 7 sẽ phát sinh E_DEPRECATED nếu một phương thức khởi tạo theo kiểu PHP 4 là phương thức khởi tạo duy nhất được định nghĩa trong một lớp. Các lớp triển khai phương thức __construct() sẽ không bị ảnh hưởng.
Hãy xem xét ví dụ sau −
<?php class A { function A() { print('Style Constructor'); } } ?>
Nó tạo ra output trên trình duyệt −
Deprecated: Methods with the same name as their class will not be constructors in a future version of PHP; A has a deprecated constructor in...
Các cuộc gọi tĩnh đến các phương thức không tĩnh đã bị ngừng sử dụng và có thể bị loại bỏ trong tương lai.
Hãy xem xét ví dụ sau −
<?php class A { function b() { print('Non-static call'); } } A::b(); ?>
Nó tạo ra output trên trình duyệt −
Deprecated: Non-static method A::b() should not be called statically in... Non-static call
Tùy chọn salt cho hàm password_hash() đã bị loại bỏ để các nhà phát triển không tự tạo ra các salt (thường không an toàn) của riêng họ. Hàm này tự động tạo ra một salt an toàn về mặt mật mã, khi không có salt nào được cung cấp bởi nhà phát triển - do đó, việc tạo salt tùy chỉnh không còn cần thiết nữa.
Tùy chọn ngữ cảnh SSL capture_session_meta đã bị loại bỏ. Dữ liệu siêu dữ liệu SSL hiện được sử dụng thông qua hàm stream_get_meta_data().
Tiện ích mở rộng mcrypt đã bị ngừng sử dụng để ủng hộ OpenSSL.
Các chuỗi không được trích dẫn mà không phải là hằng toàn cục không tồn tại sẽ được coi là chuỗi của chính chúng. Hành vi này trước đây sẽ phát ra một E_NOTICE, nhưng giờ sẽ phát ra một E_WARNING. Trong phiên bản chính tiếp theo của PHP, một ngoại lệ Error sẽ được ném ra thay vào đó.
Phương thức __autoload() đã bị loại bỏ vì nó kém hơn so với spl_autoload_register() (do không thể nối chuỗi các autoloader), và không có khả năng tương tác giữa hai kiểu autoloading này.
Do các vấn đề bảo mật của hàm này, nó đã bị loại bỏ. Giải pháp thay thế được ưa chuộng là sử dụng các hàm ẩn danh.
Hàm này gây ra các vấn đề về triển khai cho một số thay đổi ngôn ngữ. Do đó, nó đã bị loại bỏ.
Việc khai báo các hằng không phân biệt chữ hoa chữ thường đã bị loại bỏ. Việc truyền giá trị true làm tham số thứ ba cho hàm define() sẽ tạo ra một cảnh báo về việc đã bị loại bỏ.
Cách chuyển đổi (real) đã lỗi thời, hãy sử dụng (float) thay thế. Hàm is_real() cũng đã lỗi thời, hãy sử dụng is_float() thay thế.
Việc sử dụng `parent` bên trong một lớp không có lớp cha là đã lỗi thời và sẽ gây ra lỗi biên dịch trong tương lai. Hiện tại, một lỗi chỉ được tạo ra nếu/khi lớp cha được truy cập tại thời điểm chạy.
Nếu một tham số có giá trị mặc định được theo sau bởi một tham số bắt buộc, giá trị mặc định sẽ không có hiệu lực. Điều này đã bị ngừng hỗ trợ kể từ PHP 8.0.0 và có thể thường được giải quyết bằng cách bỏ giá trị mặc định, mà không làm thay đổi chức năng.
<?php function test($a = [], $b) {} // Before function test($a, $b) {} // After ?>
Một ngoại lệ đối với quy tắc này là các tham số có dạng Type $param = null, trong đó giá trị mặc định null làm cho kiểu trở thành nullable ngầm định. Việc sử dụng này vẫn được phép, nhưng được khuyến nghị sử dụng kiểu nullable rõ ràng thay vào đó.
<?php function test(A $a = null, $b) {} // Still allowed function test(?A $a, $b) {} // Recommended ?>
Gọi get_defined_functions() với tham số exclude_disabled được đặt rõ ràng là false đã bị loại bỏ và không còn tác dụng. get_defined_functions() sẽ không bao giờ bao gồm các hàm bị vô hiệu hóa.
Các hàm so sánh sắp xếp trả về true hoặc false sẽ hiện nay gây ra cảnh báo lỗi không còn được sử dụng, và nên được thay thế bằng một triển khai trả về một số nguyên nhỏ hơn, bằng hoặc lớn hơn không.
<?php // Replace usort($array, fn($a, $b) => $a > $b); // With usort($array, fn($a, $b) => $a <=> $b); ?>
Việc chuyển đổi ngầm định từ float sang int, dẫn đến mất độ chính xác, hiện đã bị ngừng sử dụng. Điều này ảnh hưởng đến các khóa mảng, các khai báo kiểu int trong chế độ cưỡng bức, và các toán tử hoạt động trên int.
Gọi một phương thức tĩnh, hoặc truy cập một thuộc tính tĩnh trực tiếp trên một trait là đã lỗi thời. Các phương thức và thuộc tính tĩnh chỉ nên được truy cập trên một lớp sử dụng trait.
date_sunrise() và date_sunset() đã bị loại bỏ. Hãy sử dụng date_sun_info() thay vào đó.
strptime() đã bị ngừng sử dụng. Sử dụng date_parse_from_format() thay thế (để phân tích không phụ thuộc vào ngôn ngữ), hoặc IntlDateFormatter::parse() (để phân tích phụ thuộc vào ngôn ngữ).
strftime() và gmstrftime() đã bị loại bỏ. Bạn có thể sử dụng date() thay thế (cho định dạng không phụ thuộc vào ngôn ngữ), hoặc IntlDateFormatter::format() (cho định dạng phụ thuộc vào ngôn ngữ).
Việc tạo các thuộc tính động đã bị loại bỏ. Thay vào đó, hãy sử dụng stdClass cho phép các thuộc tính động.