Các đối số được đặt tên trong PHP là gì?

PHP không tích hợp tham số có tên, nhưng trong hướng dẫn này, bạn có thể tìm hiểu cách mô phỏng chức năng với một chút mã bổ sung

3140 lượt xem

Các đối số được đặt tên trong PHP là gì?

Bởi. Jacob

Đã chỉnh sửa. 2021-02-05 19. 49

Các đối số được đặt tên trong PHP là gì?

Đối số được đặt tên (Còn được gọi là tham số được đặt tên) có sẵn trong PHP 8. 0 và cho phép bạn chuyển dữ liệu đầu vào vào một hàm bằng cách sử dụng tên của đối số thay vì dựa vào thứ tự của chính các đối số của hàm

Đây là một ví dụ tốt về cách chúng có thể được sử dụng trong PHP

$data = file_get_contents(
  filename:'form.html',
  use_include_path: true
);
echo $data;

Tên đối số riêng lẻ khớp với tên của các biến đầu vào của hàm. Nếu bạn có một trình soạn thảo mã khá tốt, thì bạn chỉ cần di chuột qua tên hàm để có một cửa sổ bật lên nhỏ với định nghĩa của nó, bao gồm thông tin về tên đối số; . Tuy nhiên, một nơi mà các đối số được đặt tên là hữu ích, đó là khi bạn muốn cải thiện khả năng đọc mã của mình bằng cách bỏ qua các đối số không sử dụng

Chữ ký hàm đầy đủ cho hàm file_get_contents như sau

function file_get_contents(
    $filename,
    $use_include_path = false,
    $context = null,
    $offset = 0,
    $maxlen = null
) { }

Ghi chú. Thông tin này thường có sẵn khi bạn di chuột qua tên chức năng trong trình chỉnh sửa của mình. Tôi có thể giới thiệu Eclipse hoặc Visual Studio Code với intelephense

Các phiên bản cũ hơn của PHP không có đối số tên, nhưng vẫn có thể mô phỏng chức năng này bằng cách sử dụng kết hợp mảng và kiểm tra kiểu — mặc dù cá nhân tôi không khuyến nghị điều này — Tôi đã dùng thử một thời gian và nhận thấy nó chỉ làm rối trang của tôi. . Tuy nhiên, giải pháp cũ của tôi vẫn được đưa vào các phần sau

Nếu bạn đang làm việc trong một dự án lớn hơn, thì tôi thực sự khuyên bạn nên sử dụng các tham số được đặt tên cho các hàm và phương thức tùy chỉnh trong suốt dự án của mình. Làm như vậy cho phép bạn dễ dàng thay đổi định nghĩa hàm hoặc phương thức sau này mà không phải thay đổi tất cả mã trong dự án của bạn phụ thuộc vào hàm

Đối với các phiên bản PHP cũ hơn

Vấn đề với các đối số hàm trong các phiên bản PHP cũ là bạn phải nhập chúng theo một thứ tự cụ thể để chúng hoạt động. Đối với các chức năng của người dùng, đây là vấn đề khi bạn cần thay đổi các đối số mà một chức năng chấp nhận, vì khi đó bạn sẽ phá vỡ mã hiện có sử dụng chức năng đó. Với các đối số được đặt tên, chúng tôi không gặp phải những vấn đề này

Bây giờ, trong khi PHP không hỗ trợ các tham số được đặt tên, chúng ta có thể tiến rất gần bằng cách sử dụng một mảng kết hợp thay vì sử dụng các tham số vị trí

Tốt nhất, chúng ta nên lựa chọn cẩn thận và chỉ sử dụng mảng cho một số chức năng nhất định. Nó cũng không cần thiết cho một chức năng chấp nhận cả hai tham số được đặt tên và vị trí mặc dù nó sẽ khá gọn gàng

Ngoài ra, nếu một hàm chỉ chấp nhận một vài tham số và chúng tôi khá chắc chắn rằng chữ ký sẽ không thay đổi, thì tốt nhất là không nên làm phức tạp thêm bằng cách sử dụng mảng

Lợi ích

1. Một lợi ích là chúng ta không cần nhớ thứ tự của các đối số của hàm—điều quan trọng là tên của đối số

2. Một lợi ích khác là chúng ta không còn phải khai báo các giá trị trống trước khi đến đối số quan tâm, không giống như trong ví dụ xấu bên dưới

my_function(false, '', 'this is what we want');

3. Cuối cùng, việc thay đổi chữ ký tham số của hàm sẽ không phá vỡ mã hiện có khi sử dụng hàm. Điều này có thể cực kỳ có lợi trong các dự án lớn hơn, vì bạn không phải cập nhật mã toàn cầu của mình chỉ để giới thiệu đối số chức năng mới

Nhược điểm

Việc triển khai hiện tại của các tham số được đặt tên không hoàn toàn không có nhược điểm. Trong khi tôi sẽ thảo luận về một số bên dưới, có thể có nhiều hơn

1. Một trong những nhược điểm chính là trình soạn thảo mã của chúng tôi sẽ không thể hiển thị các đối số hàm theo mặc định và kết quả là bây giờ chúng tôi cần biết về việc triển khai hàm. Cá nhân tôi nghĩ rằng đây là một cái giá nhỏ phải trả và bạn thực sự có thể khắc phục điều này bằng một plugin nếu bạn thực sự muốn

Một giải pháp khả thi khác là tiết lộ $definite_arguments trong thông báo lỗi khi một tham số được sử dụng không chính xác hoặc bị thiếu

2. Cuối cùng, việc có thêm mã so sánh $input_arguments với $define_arguments của chúng tôi sẽ ảnh hưởng đến hiệu suất một chút. Hầu hết thời gian, điều này có lẽ sẽ không quan trọng lắm

Mảng và tham số được đặt tên

Chúng ta có thể chọn một giải pháp dễ dàng, như giải pháp này

say_hallo(['name' => 'Jacob', 'email' => '[email protected]']);

function say_hallo($input_arguments=[]) {
    $name = null;
    $email = null;
    extract($input_arguments,EXTR_IF_EXISTS);

    echo 'Name: ' . $name  . PHP_EOL;
    if ($email !== null) {
        echo 'Email: ' . $email . PHP_EOL;
    }
}

Hoặc, chúng tôi có thể chọn một giải pháp an toàn hơn cũng hiển thị các thông báo lỗi hữu ích cho nhà phát triển

Ví dụ: chỉ bằng cách viết thêm một chút mã, chúng tôi cũng có thể hỗ trợ gợi ý loại, chặn các tham số không xác định và thêm hỗ trợ cho các tham số bắt buộc và tùy chọn. Để làm như vậy, chúng ta chỉ cần xác định các tham số được sử dụng bởi các chức năng của chúng ta

Gọi một hàm chấp nhận một mảng tham số có thể được thực hiện như thế này

// A function with named parameters
say_hallo(['name' => 'Jacob', 'email' => '[email protected]']);

Thực hiện

Trong phần này, tôi sẽ trình bày cách sử dụng mảng để thay thế cho các tham số được đặt tên trong PHP

Như đã thảo luận trước đó, khi tạo một chức năng mới, trước tiên chúng ta sẽ phải xác định các tham số mà chức năng sẽ chấp nhận. Lợi ích trực tiếp của việc này là giờ đây chúng ta có thể chặn các tham số không xác định và viết sai chính tả—điều mà PHP không tự làm được

Ngoài ra, chúng tôi cũng có thể quyết định xem một tham số nên được xác định là bắt buộc hay tùy chọn và thậm chí chúng tôi có thể chọn xác thực loại tham số

Ghi chú. Ví dụ này sử dụng mã thủ tục đơn giản, bạn có thể muốn kiểm tra lớp php_helpers để biết cách triển khai hướng đối tượng của mã này

Trong ví dụ dưới đây, tôi đang xác định các tham số trong biến $define_arguments, biến này chứa định nghĩa của các tham số mà chúng tôi muốn cho phép

function say_hallo(array $input_arguments) {
  // Define allowed $input_arguments
  $defined_arguments = ['name' => ['required' => true, 'type' => 'string'], 'email' => false];

  // Check that the used parameters is allowed in defined parameters
  handle_arguments($input_arguments, $defined_arguments);
  

  // *****
  // *** Function code
  // ** *
  echo 'Name: ' . $input_arguments['name'] . PHP_EOL;

  // Output the e-mail address only if provided.
  if (isset($input_arguments['email'])) {
    echo 'Email: ' . $input_arguments['email'] . PHP_EOL;
  }
}

Các đối số có thể được xác định là đúng đối với yêu cầu hoặc sai đối với tùy chọn. Nếu bạn cũng muốn kiểm tra loại tham số, bạn chỉ cần sử dụng một mảng thay vì giá trị boolean. Dưới đây là một vài ví dụ hợp lệ hơn

// Required With Type Checking
$defined_arguments = ['name' => ['required' => true, 'type' => 'string'];

// Required Without Type Checking
$defined_arguments = ['name' => true];

// Optional With Type Checking
$defined_arguments = ['name' => ['required' => false, 'type' => 'string'];

// Optional Without Type Checking
$defined_arguments = ['name' => false];

Chức năng sẽ bị gián đoạn với exit();

Để xử lý các định nghĩa đối số, chúng ta có thể sử dụng một vài chức năng như thế này

function handle_arguments($input_arguments, $defined_arguments) {
  // Check if parameter is defined, and validate the type (if provided)
  foreach ($input_arguments as $key => $value) {
    if (!isset($defined_arguments["$key"])) {
      echo 'Unknown function parameter: ' . $key . PHP_EOL;
      echo 'used in: ' . __FUNCTION__ . PHP_EOL;
      exit();
    }
    // Validate the type, if defined. A type is always defined in an array.
    // I.e.: array('required' => true, 'type' => 'object')
    if (is_array($defined_arguments["$key"])) {
      // Check if the developer remembered to define both "required" and "type"
      if ((!isset($defined_arguments["$key"]['required'])) || (!isset($defined_arguments["$key"]['type']))) {
        echo 'Missing argument definition "required" or "type".';
        exit();
      }
      if (!type_check($value, $defined_arguments["$key"]['type'])) {
        echo 'Invalid input type of: ' . $key . PHP_EOL;
        echo 'used in: ' . __FUNCTION__ . PHP_EOL;
        echo 'Expected ' . $defined_arguments["$key"]['type'] . ', ' . gettype($value) . ' given.' . PHP_EOL;
        exit();
      }
      // In case value was an array, make sure to add possible default elements.
      if ((isset($defined_arguments["$key"]['default'])) && (is_array($defined_arguments["$key"]['default']))) {
        $input_arguments["$key"] += $defined_arguments["$key"]['default'];
      }
    }
  }
  // --------------------------------------------------
  // Check for missing required parameters-------------
  // The "required" setting only needs to be checked when the parameter is missing
  // --------------------------------------------------
  $missing_parms = array_diff_key($defined_arguments, $input_arguments);
  foreach ($missing_parms as $key => $value) {
    if (!is_array($defined_arguments["$key"])) {
      // If no type validation
      if (true === $defined_arguments["$key"]) {
        echo 'Missing required parameter: ' . $key . PHP_EOL;
        echo 'used in: ' . __FUNCTION__ . PHP_EOL;
        exit();
      }
    } else {
      // Check if the developer remembered to define both "required" and "type"
      if ((!isset($defined_arguments["$key"]['required'])) || (!isset($defined_arguments["$key"]['type']))) {
        echo 'Missing argument definition "required" or "type". ';
        exit();
      }
      // If type was to be validated, check the "required" key
      if (true === $defined_arguments["$key"]['required']) {
        echo 'Missing required parameter: ' . $key . PHP_EOL;
        echo 'used in: ' . __FUNCTION__ . PHP_EOL;
        exit();
      }
      // Check if the parameter has a default value
      if (isset($defined_arguments["$key"]['default'])) {
        $input_arguments["$key"] = $defined_arguments["$key"]['default'];
      }
    }
  }
  return $input_arguments;
}
function type_check($input_value, $defined_type) {
    switch ($defined_type) {
        case 'string':
          return is_string($input_value);
        break;
        case 'str':
          return is_string($input_value);
        break;
        case 'integeer':
          return is_int($input_value);
        break;
        case 'int':
          return is_int($input_value);
        break;
        case 'object':
          return is_object($input_value);
        break;
        case 'array':
          return is_array($input_value);
        break;
        case 'bool':
          return is_bool($input_value);
        break;
        case 'resource':
          return is_resource($input_value);
        break;
        case 'null':
          return is_null($input_value);
        break;

        // Mixed type will allow anything
        case 'mixed':
          return true;
        break;

        // For unknown types we return false
        default:
          return false;
        break;
    }
}

Ghi chú. Các câu lệnh echo chỉ đơn giản là cho mục đích trình diễn. Bạn có thể dễ dàng thay thế chúng bằng cách xử lý lỗi của riêng bạn

Có gì trong một đối số tên?

Trong lập trình máy tính, các tham số được đặt tên, đối số được đặt tên hoặc đối số từ khóa đề cập đến sự hỗ trợ của ngôn ngữ máy tính đối với các lệnh gọi hàm nêu rõ tên của từng tham số trong lệnh gọi hàm.

PHP có các tham số được đặt tên không?

PHP và nhiều ngôn ngữ lập trình khác hỗ trợ tham số vị trí. Người gọi chuyển các tham số theo thứ tự mà hàm/phương thức khai báo các tham số của nó. Trong PHP 8. 0, hỗ trợ Tham số được đặt tên được thêm vào , nghĩa là giờ đây có thể gọi một hàm/phương thức bằng cách đặt tham số theo tên của chúng.

4 loại đối số trong Python là gì?

Trong Python, chúng ta có 4 loại đối số hàm sau. .
Đối số mặc định
Đối số từ khóa (đối số được đặt tên)
đối số vị trí
Đối số tùy ý (đối số có độ dài thay đổi *args và **kwargs )

Đối số mặc định của PHP là gì?

PHP cho phép bạn xác định các giá trị đối số mặc định kiểu C++. Trong trường hợp như vậy, nếu bạn không chuyển bất kỳ giá trị nào cho hàm, nó sẽ sử dụng giá trị đối số mặc định. Hãy xem ví dụ đơn giản về việc sử dụng các đối số mặc định của PHP trong hàm