Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> PHP

Tham số hàm (Function arguments) trong PHP

Giới thiệu

Function trong PHP có thể định nghĩa để nhận input từ môi trường gọi dưới dạng arguments. Các argument được đưa ra như danh sách phân cách bằng dấu phẩy trong ngoặc đơn sau tên function. Lưu ý: khi gọi function, phải truyền đúng số lượng argument.

PHP hỗ trợ gọi function bằng: truyền giá trị (pass by value), truyền tham chiếu (pass by reference), argument có default value, và số lượng argument biến đổi (variadic).

Function với arguments

Truyền bằng giá trị (Pass by value)

Arguments trở thành biến local trong function. Thay đổi giá trị argument bên trong function không phản ánh ra ngoài.

<?php
function add($x, $y) {
    $x = $x + $y;
    echo $x . "\n";
}
$x = 10; $y = 20;
add($x, $y);
// Bên ngoài function $x không đổi
echo $x;
?>

Kết quả

30
10

Truyền mảng cho function

<?php
function add($arr) {
    $sum = 0;
    foreach ($arr as $i) {
        $sum += $i;
    }
    echo "sum = $sum";
}
add(array(1, 2, 3));
?>

Kết quả

sum = 6

Truyền tham chiếu (Pass by reference)

Mặc định argument truyền bằng giá trị. Thay đổi trong function không ảnh hưởng bên ngoài. Khi truyền bằng tham chiếu, thay đổi được phản ánh ra biến gốc.

Để nhận bằng tham chiếu, tên argument tiền tố bằng &:

<?php
function swap(&$x, &$y) {
    $t = $x;
    $x = $y;
    $y = $t;
    echo "inside function x=$x y=$y\n";
}
$x = 5; $y = 7;
echo "before calling function x=$x y=$y\n";
swap($x, $y);
echo "after calling function x=$x y=$y\n";
?>

Kết quả

before calling function x=5 y=7
inside function x=7 y=5
after calling function x=7 y=5

Phần tử mảng là tham chiếu

<?php
$a = 10; $b = 20; $c = 30;
$arr = array(&$a, &$b, &$c);
for ($i = 0; $i < 3; $i++) $arr[$i]++;
echo "$a $b $c";
?>

Kết quả

11 21 31

Truyền mảng bằng tham chiếu

<?php
function arrfunction(&$arr) {
    for ($i = 0; $i < 5; $i++)
        $arr[$i] = $arr[$i] + 10;
}
$arr = [1, 2, 3, 4, 5];
arrfunction($arr);
foreach ($arr as $i) echo $i . " ";
?>

Kết quả

11 12 13 14 15

Object và tham chiếu

Trong PHP, object được truyền bằng tham chiếu mặc định. Khi tạo reference của object, reference cũng được gửi như argument dưới dạng $this (cũng là reference đến object đầu tiên).

<?php
class Test1 {
    private $name;
    function getname() { return $this->name; }
    function setname($name) { $this->name = $name; }
}
$obj1 = new Test1();
$obj2 = &$obj1;
$obj1->setname("Amar");
echo "name: " . $obj2->getname();
?>

Kết quả

name: Amar

Type hints (Khai báo kiểu)

PHP là ngôn ngữ kiểu động. Không cần khai báo kiểu biến (như C/C++/Java). Tuy nhiên, type declaration của argument cho phép parser phát hiện kiểu dữ liệu sai truyền vào function.

Cú pháp

function myfunction(type $arg1, type $arg2) { ... }

Tất cả kiểu PHP chuẩn (scalar, array, class/interface, iterable, object) đều hợp lệ cho type hint.

Ví dụ type hint int

<?php
function add(int $x, int $y) {
    $z = $x + $y;
    echo "addition = $z\n";
}
add(10, 20);
add(5.55, 6.66);
?>

Kết quả

addition = 30
addition = 11

Lần gọi 2 truyền float nhưng không lỗi vì PHP ép float thành int. Để ngăn chặn ép kiểu tự động, dùng declare(strict_types=1):

<?php
declare(strict_types=1);
function add(int $x, int $y) {
    $z = $x + $y;
    echo "addition = $z\n";
}
add(10, 20);
add(5.55, 6.66);
?>

Kết quả

addition = 30
PHP Fatal error: Uncaught TypeError: Argument 1 passed to add() must be of the type integer, float given