Function

Khai báo hàm trong PHP

Hàm trong PHP tương tự như hàm trong C tuy nhiên không khai báo kiểu dữ liệu của tham số và kiểu dữ liệu trả về. Khác biệt nữa là có thể sử dụng hàm trước rồi mới khai báo cách cài đặt hàm sau.

1
2
3
4
5
6
<?php
foo();
function foo($arg_1, $arg_2, /* ..., */) {
  echo "Example function.\n";
  return 1;
}

Có thể khai báo hàm trong hàm, hoặc hàm trong if.

1
2
3
4
5
6
7
8
<?php
function foo()  {
  function bar() {
    echo "Hàm này chưa tồn tại khi hàm foo() chưa được gọi\n";
  }
}
foo(); // gọi hàm foo
bar(); // gọi hàm bar

Truyền tham số vào hàm

Ngoài cách truyền tham biến thông thường, trong PHP có cách truyền tham số dạng tham chiếu với ký tự & ở trước tham số. Cách truyền tham chiếu sẽ lấy giá trị của biến lúc truyền vào chứ không tạo biến mới.

1
2
3
4
5
6
7
<?php
function add_string(&$string) {
  $string .= ' vui vẻ';
}
$string = 'Một ngày đi học';
add_string($string);
echo $string;

Truyền giá trị mặc định vào tham số giống như C++.

1
2
3
4
5
6
7
<?php
function add_string(&$string, $appendString = ' vui vẻ') {
  $string .= $appendString;
}
$string = 'Một ngày đi học';
add_string($string);
echo $string;

Trường hợp không truyền tham số thì không thay đổi được giá trị truyền vào hàm:

1
2
3
4
5
6
7
<?php
function add_array($arr) {
  $arr[] = 4;
}
$arr = [1,2,3];
add_array($arr); // không làm thay đổi array
var_dump($arr); // [1, 2, 3]

Trường hợp truyền object vào tham số thì PHP coi đó là tham chiếu (không cần sử dụng toán tử &).

Khai báo kiểu cho tham số của hàm

Trong PHP có tùy chọn khai báo kiểu cho tham số của hàm.

Một số kiểu thường dùng là

Kiểu Ý nghĩa Từ phiên bản
Tên Class hoặc Interface Kiểu của tham số phải là thể hiện của tên Class hoặc Interface đó PHP 5.0.0
self Kiểu của tham số phải là thể hiện của Class hoặc Interface hiện tại PHP 5.0.0
array Kiểu của tham số là array PHP 5.1.0
callable Kiểu của tham số là callable PHP 5.4.0

Ngoài ra từ phiên bản PHP 7.0 còn có thêm các kiểu là bool, float, intstring.

Ví dụ như sau:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
<?php
class C {}
class D extends C {} // class D thừa kế từ class C

function getName(C $c) { // $c có kiểu là class C
  echo get_class($c) . "\n"; // hàm get_class sẽ lấy tên class
}
getName(new C); // C
getName(new D); // D
getName("abc"); // Lỗi vì "abc" không phải là thể hiện của C

Giá trị trả về của hàm

Nếu không khai báo giá trị trả về của hàm thì hàm trả về giá trị NULL.
Hàm cũng có thể trả về một tham chiếu. Khi hàm trả về tham chiếu cả tên hàm và lúc gán tham chiếu cho biến đều sử dụng ký hiệu &.

1
2
3
4
5
6
7
8
<?php
function &returns_reference() {
  $a = 'abc';
  return $a;
}

$newref = &returns_reference();
echo $newref;

Phiên bản PHP 7 có hổ trợ thêm kiểu giá trị trả về.

1
2
3
4
5
6
7
<?php
// hàm trả về kiểu float
function sum($a, $b): float {
  return $a + $b;
}

var_dump(sum(1, 2)); // float (3.0)