Hướng dẫn dùng depracted trong PHP

Sau đây là danh sách một số các tính năng được dự thảo có thể sẽ bị deprecated trong phiên bản PHP 7.2 và sẽ loại bỏ trong các phiên bản tiếp theo (không muộn hơn phiên bản PHP 8.0). Bạn có thể tham khảo thêm tại PHP RFC: Deprecations for PHP 7.2.

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

Nội dung chính

  • $php_errormsg
  • create_function()
  • mbstring.func_overload
  • Ép kiểu (unset)
  • parse_str() không có tham số thứ 2
  • gmp_random()
  • assert() với tham số string
  • Tham số $errcontext của error handler

__autoload

Function __autoload đã được thay thế bởi spl_autoload_register trong PHP 5.1. Một lợi thế chính của spl_autoload_register () là khả năng cung cấp nhiều chained autoloaders, do đó dễ dàng tương tác với các thư viện hơn. Cả hai cơ chế loại trừ lẫn nhau, ví dụ code sử dụng autoload () không thể tương thích với code sử dụng spl_autoload_register(). Sau này chúng ta thường sử dụng và làm việc với Composer, nên __autoload() được ứng dụng rất hạn chế.

$php_errormsg

Biến $php_errormsg được tạo ra trong phạm vi local bất cứ khi nào một lỗi non-fatal được thrown nếu thiết lập track_errors ini được kích hoạt (mặc định tắt), và lỗi không được xử lý bởi một error handler.

Ngoài ra PHP có hàm error_get_last() mang lại một cách minh bạch hơn để lấy về lỗi cuối cùng. PHP 7 cũng bổ sung hàm error_clear_last(), chúng ta có thể hoàn toàn kiểm soát việc lấy về lỗi cuối cùng tương tự như $php_errormsg.

create_function()

Hàm create_function() là một wrapper của hàm eval() cho phép tạo ra một hàm với tên, các tham số, nội dung của hàm được truyền vào như một chuỗi string. Trước khi giới thiệu closures trong PHP 5.3, nó cung cấp một cách để tạo ra một cái gì đó giống như các hàm lambda.

Do tính chất của create_function(), ngoài việc mang một nguồn tiềm tàng về các vấn đề bảo mật, nó còn có hiệu suất kém, sử dụng bộ nhớ không hiệu quả, và việc sử dụng closures trong đa số các trường hợp là thích hợp hơn.

mbstring.func_overload

Các cài đặt mbstring.func_overload ini cho phép thay thế một loạt các string functions với các functions tương tự từ mbstring extension. Ví dụ strlen() sẽ không còn trả về độ dài của một chuỗi theo byte, thay vào đó nó sẽ trả về độ dài tại các code points theo internal ecoding đang được chọn, ví dụ những ký tự nhiều byte cũng chỉ được tính là 1.

Điều này ngụ ý rằng code sử dụng mbstring.func_overload là không phù hợp với thực tế tất cả các code khác nhau, được viết theo giả định rằng các toán tử string cơ bản làm việc bình thường. Một số thư viện hoàn toàn cấm func_overload (ví dụ Symfony), và các thư viện khác có lẽ cũng hạn chế với những cách tinh tế khác. Đoạn code nào đó mong muốn hỗ trợ func_overload cần phải có điều kiện chuyển đổi giữa string functions căn bản và mbstring functions với 8bit encoding (tuy nhiên chỉ có các thư viện mã hoá thường bận tâm để làm điều này).

Ép kiểu (unset)

Biểu thức (unset) ép kiểu một giá trị thành null. Điều này có nghĩa rằng biểu thức (unset) chỉ đơn giản là một biểu thức luôn luôn trả về null và không có tác dụng phụ khác. Ngoài việc vô ích, cách sử dụng này cũng khá là khó hiểu, như nhiều người nghĩ rằng (unset)$a sẽ cho kết quả tương tự như unset($a), trong khi sự thật không phải như thế.

parse_str() không có tham số thứ 2

Hàm parse_str() được sử dụng để phân tích một query string vào một mảng nếu tham số thứ 2 được truyền vào, hoặc được gán vào các biến local nếu không được truyền.

Cách làm thứ 2 cũng xảy ra các vấn đề tương tự về phạm vi sử dụng các biến như register_globals và gây ra mối nguy hiểm bảo mật lớn nếu sử dụng dữ liệu do người dùng cung cấp.

gmp_random()

Các gmp_random () trả về một số GMP ngẫu nhiên giữa 0 và 2 ** ($n * BITS_PER_LIMB) -1, trong đó $n là tham số function và BITS_PER_LIMB là một tham số nền tảng cụ thể của việc thực hiện GMP/MPIR mà không được tiếp xúc với không gian sử dụng. Như vậy, việc sử dụng chức năng này đòi hỏi phải đoán limb size và có thể sẽ có một sự phụ thuộc nền tảng.

Để khắc phục điều này PHP 5.6 giới thiệu function gmp_random_bits() và function gmp_random_range (), cho phép điều khiển chính xác dải dãy số ngẫu nhiên được sử dụng. Các function này nên luôn luôn được ưa thích hơn gmp_random().

each()

Function each() có thể được sử dụng để lặp qua một mảng, tương tự như sử dụng foreach. Mỗi một lần được gọi, nó sẽ trả về một mảng với những key và value hiện tại và tịnh tiến con trỏ tới vị trí phần tử tiếp theo. Ví dụ cách sử dụng each():

reset($array); while (list($key, $val) = each($array)) { echo "$key => $val \n"; }

Function each() tệ hơn foreach khá nhiều, nó chậm hơn hơn những 10 lần. Sự tồn tại tiếp tục của function này đặt ra một vấn đề đối với những thay đổi ngôn ngữ nhất định. Ví dụ RFC https://wiki.php.net/rfc/notice-for-non-valid-array-container loại bỏ list(), vì việc sử dụng điển hình của each dựa trên thực tế là bạn có thể truy cập vào array offsets false mà không có cảnh báo.

assert() với tham số string

Function assert() có hai chế độ hoạt động: Nếu nó được truyền vào một cái gì đó khác string, nó sẽ kiểm tra xem giá trị có phải là truthy. Nếu một string được truyền vào, nó sẽ được chạy qua eval() và assert sẽ kiểm tra xem kết quả của eval() có phải là truthy.

Lý do cho việc này là trước khi PHP 7 này là cách duy nhất để ngăn chặn các biểu hiện sự khẳng định từ đánh giá. Tính đến PHP 7, zend.assertions ini option có thể được sử dụng để tránh việc đánh giá các assertion expressions. Như vậy, không còn nhu cầu để hỗ trợ các tham số string ngầm định.

Cách làm này của assert() làm cho nó dễ dàng để tạo ra lỗ hổng thực thi mã từ xa tinh tế. Sử dụng assert($value) để kiểm tra xem một giá trị truthy mở ra một lỗ hổng RCE nếu cho phếp truyền vào $value như một string.

Tham số $errcontext của error handler

Error handler được thiết lập với set_error_handler() và truyền vào $errcontext như là tham số cuối cùng. Tham số này là một mảng chứa tất cả các biến local tại thời điểm các lỗi đã được tạo ra.

Chức năng này là có vấn đề về tối ưu hóa, vì $errcontext có thể được sử dụng để thay đổi tất cả các biến và các đối tượng liên quan trong phạm vi hiện tại. Theo như tôi biết, chức năng này hầu như không được sử dụng và đánh giá cao. Nếu mọi người muốn kiểm tra các biến trạng thái tại thời điểm một lỗi xảy ra, họ nên sử dụng một debugger thích hợp.

Lưu ý rằng error context chỉ chứa các biến local tại các chỗ gây lỗi. Các error backtrace, bao gồm $this và các tham số hàm sẽ được lưu trữ thông qua debug_backtrace().