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