Hàm (functions) trong PHP
Mục lục
Khái niệm hàm (function) trong PHP
Tương tự các ngôn ngữ khác, hàm trong PHP là một đoạn chương trình độc lập thực hiện một tác vụ cụ thể, được xác định rõ và có thể được người dùng gọi nhiều lần theo yêu cầu của họ.
Một số lợi ích của việc sử dụng hàm trong PHP:
- Sử dụng lại mã: Các hàm PHP có thể tái sử dụng và có thể được gọi nhiều lần trong cùng một chương trình
- Mã ngắn gọn hơn (viết mã ít hơn): Việc sử dụng các hàm mang lại sự linh hoạt để viết mã một lần và sử dụng lại mã tương tự bất cứ khi nào được yêu cầu. Điều này làm giảm số lượng mã viết và cũng giảm thời gian viết mã
- Mã tường minh hơn: Các hàm PHP tách biệt logic lập trình. Điều này cho phép người dùng hiểu được luồng ứng dụng khi mã được chia thành các chức năng khác nhau.
Một số hàm dựng sẵn trong PHP
Các hàm dựng sẵn là các hàm làm sẵn do PHP cung cấp. Một số chức năng cốt lõi có sẵn tự động trong khi một số yêu cầu các phần mở rộng bổ sung để sử dụng chúng.
PHP cung cấp rất nhiều hàm dựng sẵn (trên 1000 hàm) giúp người dùng hoàn thành các tác vụ thông thường. Điều này giúp người dùng dễ dàng thực hiện và chạy lại các tác vụ phổ biến trong một chương trình.
Hàm abs()
Tính giá trị tuyệt đối. Ví dụ:
echo abs(-5);
// output: 5
Hàm gettype()
Người dùng có thể nhập một biến, hằng số làm đối số cho hàm này và đầu ra là một giá trị chuỗi biểu thị kiểu dữ liệu của đối số. Ví dụ:
<?php
$varl = 3; // integer value
$var2 = 5.6; // double value
$var3 = "Abc3462"; // string value
echo gettype ($varl) . "<br>";
echo gettype ($var2). "<br>";
echo gettype ($var3). "<br>";
// output
// integer
// double
// string
Hàm var_dump()
Hàm này cũng chấp nhận một tên biến làm đối số và đầu ra là thông tin chi tiết về đối số được truyền cho nó. Đây là một hàm được sử dụng rất phổ biến trong quá trình gỡ lỗi, vì dữ liệu khi in ra sẽ đầy đủ chi tiết bao gồm giá trị và kiểu của dữ liệu. Ví dụ:
<?php
$integer_variable = 10;
var_dump($integer_variable);
//Output:
// int(10)
$array_variable = array(
"name" => "Hello World",
"age" => 3
);
var_dump($array_variable);
/* Output:
array(2) {
["name"]=>
string(7) "Hello World"
["age"]=>
int(3)
}
*/
Hàm làm việc với mảng (array functions)
Trong PHP, mảng là một phần của hàm dựng sẵn. Một mảng có thể được tạo bằng cách sử dụng hàm array(). Hàm này cho phép người dùng làm việc với mảng theo nhiều cách. Mảng giúp người dùng lưu trữ, quản lý và thao tác trên các tập biến.
Xem thêm ví dụ tại: https://hocvietcode.com/mang-array-trong-php/
Một số hàm nâng cao làm việc với mảng trong PHP:
Tên hàm | Mô tả |
array_change_key_case(array $array, int $case) | Chuyển tất cả các khóa trong một mảng thành chữ thường hoặc chữ hoa. |
array_chunk(array $array, int $length, bool $preserveKeys) | Hàm này chia một mảng thành các mảng nhỏ hơn |
function array_column (array $source_array, int|string $column_key = null, int |string $index_key = null) | Hàm này tạo một mảng từ cột được đề cập |
array_combine (array $keys, array $values) | Hàm này tạo ra một mảng sử dụng các phần tử từ các khóa mảng và giá trị của mảng. |
array_count_values (array $array) | Hàm này đếm tất cả giá trị của mảng |
array_diff($array1, $array2, …$arrays); | Hàm này trả ra sự khác biệt sau khi so sánh các mảng. Nó chỉ so sánh các giá trị. |
array_diff_assoc(array $keys, array $values); | Hàm này cũng trả ra sự khác biệt, nhưng so sánh cả khóa và giá trị. |
array_diff_key(array $array, array …$arrays) | Hàm này cũng trả ra sự khác biệt, nhưng chỉ so sánh các khóa. |
array_fill(int $start_index, int $num, mixed $value) | Hàm này giúp chèn các giá trị vào một mảng. |
array_filter(array $array, callable $callback, int $mode) | Hàm này giúp lọc các giá trị mảng bằng hàm gọi lại. |
array_flip(array $Sarray) | Hàm này hoán đổi tất cả các khóa với các giá trị tương ứng của chúng trong một mảng |
array_intersect(array $arr1, array …$arrays) | Hàm này so sánh các giá trị trong các mảng và hiển thị kết quả so khớp. |
array_map(?callable $callback, array $array, array …$arrays) | Hàm này chuyển từng giá trị của một mảng sang hàm do người dùng tạo, từ đó trả ra các giá trị mới |
array_key_exists(string $key, array $array) | Hàm này kiểm tra mảng để tìm phần tử theo khóa được đề cập. |
array_keys (array $array) | Hàm này hiển thị tất cả các khóa của một mảng. |
array_merge(array $arrays) | Chức năng này kết hợp một hoặc nhiều mảng thành một mảng duy nhất. |
Hàm làm việc với chuỗi (string functions)
Các hàm chuỗi cũng là một phần cốt lõi của PHP. Chúng giúp người dùng thực hiện các thao tác khác nhau trên chuỗi. Để thực hiện các tác vụ phổ biến liên quan đến chuỗi, người dùng có thể sử dụng các hàm chuỗi tích hợp khác nhau được lưu trong gói cài đặt PHP. Các chức năng này có thể được sử dụng mà không cần phải cài đặt thêm gì.
Một số hàm phổ biến liên quan đến chuỗi có sẵn trong PHP.
Hàm | Mô tả |
sprintf() | Hàm này ghi một chuỗi được định dạng vào một biến. |
sscanf() | Hàm này phân tích đầu vào từ một chuỗi theo một định dạng. |
strcasecmp() | Hàm này thực hiện so sánh hai chuỗi đã cho và không xác định ký tự hoa thường. |
strchr() | Hàm này xác định vị trí tìm thấy đầu tiên của chuỗi trong chuỗi khác, |
strcmp() | Hàm này thực hiện so sánh hai chuỗi đã cho và có xác định ký tự hoa thường. |
strcoll() | Hàm này thực hiện so sánh hai chuỗi đã cho và không xác định ký tự hoa thường, tuy nhiên có so sánh thêm collation ( ký tự đối chiếu) |
stripos() | Hàm này trả về vị trí của phiên bản đầu tiên của một chuỗi trong một chuỗi khác không phân biệt chữ hoa chữ thường. |
stristr() | Hàm này trả về chuỗi đầu tiên của một chuỗi trong một chuỗi khác, không phân biệt chữ hoa chữ thường. |
strlen() | Hàm tả về độ dài (số ký tự) của chuỗi. |
strpbrk() | Hàm này tìm kiếm một tập hợp các ký tự nhất định trong một chuỗi, |
strpos() | Hàm này trả về vị trí của phiên bản đầu tiên của một chuỗi trong một chuỗi khác có phân biệt chữ hoa chữ thường. |
strrev() | Hàm này trả về một chuỗi đã cho theo thứ tự ngược lại. |
strripos() | Hàm này trả về vị trí của phiên bản cuối cùng của một chuỗi trong một chuỗi khác, không phân biệt chữ hoa chữ thường. |
strrpos() | Hàm này trả về vị trí của phiên bản cuối cùng của một chuỗi trong một chuỗi khác. Có phân biệt chữ hoa chữ thường. |
strspn() | Hàm này trả về số lượng ký tự có trong một chuỗi chỉ có các ký tự từ một danh sách cụ thể. |
substr_count() | Hàm này trả về tổng số lần một chuỗi con xuất hiện trong một chuỗi |
wordwrap() | Hàm này bọc một chuỗi thành một số ký tự được chỉ định. |
vsprintf() | Hàm này ghi một chuỗi được định dạng vào một biến. |
strtolower() | Hàm này thay đổi chuỗi đối số thành tất cả các chữ cái viết thường. |
strrepeat() | Hàm có hai đối số – đầu tiên là một chuỗi và thứ hai là một số. Nó xuất ra chuỗi đối số lặp lại nó bằng số lượng được đề cập trong đối số thứ hai. |
Hàm làm việc với luồng (stream functions)
Stream(luồng) là cách dễ dàng để truy cập dữ liệu từ tệp (file), mạng hoặc các nguồn khác mà không tiêu tốn bộ nhớ không mong muốn. Nó cho phép người dùng truy cập nhiều loại dữ liệu bằng cách sử dụng một bộ chức năng và công cụ chung, đồng thời xây dựng một giao diện thống nhất, Nó có thể được đọc hoặc ghi theo kiểu tuyến tính và có thể tìm thấy vị trí trong luồng.
Mã bổ sung hướng dẫn luồng về cách quản lý các giao thức hoặc mã hóa cụ thể được gọi là trình bao bọc (wrapper). Các hàm stream cũng là một phần của core PHP. Người dùng có thể sử dụng các hàm này mà không cần phải cài đặt thêm gì.
Một số hàm làm việc với stream:
Trong mô tả này, có khái niệm khá trừu tượng là bucket brigrade, không có khái niệm tiếng Việt, tuy nhiên có thể dịch ra là lữ đoàn xô, hiểu nôm na là dòng người chuyền xô nước từ người này sang người khác để dập lửa. Tương tự với cơ chế truyền dữ liệu của stream.
Hàm | Mô tả |
stream_bucket_append() | Chức năng này nối bucket vào brigrade |
stream_bucket_make_writeable() | Hàm này trả về một đối tượng xô từ bucket brigade đang muốn lấy. |
stream_socket_server() | Hàm này tạo ra một socket (một giao diện lập trình về ứng dụng mạng sử dụng để truyền cũng như nhận dữ liệu trên internet) máy chủ tên miền Internet hoặc Unix. |
stream_supports_lock() | Hàm này thông báo luồng có bị khóa hay không. |
stream_wrapper_register() | Hàm này ghi lại trình bao bọc URL được thiết lập dưới dạng PHP class. |
stream_socket_shutdown() | Hàm này dừng kết nối song công toàn phần (full duplex). |
stream_wrapper_restore() | Hàm này giúp khôi phục trình bao bọc tích hợp sẵn chưa được đăng ký trước đó. |
stream_wrapper_unregister() | Hàm này giúp hủy đăng ký trình bao bọc URL. |
stream_copy_to_stream() | Hàm này sao chép thông tin từ luồng này sang luồng khác |
stream_is local() | Hàm này kiểm tra xem một luồng có phải là luồng cục bộ hay không. |
Ví dụ stream_bucket_append và stream_bucket_make_writeable:
<?php
// Define a custom stream filter class
class UppercaseFilter extends php_user_filter {
// Filter function
public function filter($in, $out, &$consumed, $closing) {
while ($bucket = stream_bucket_make_writeable($in)) {
// Convert the data to uppercase
$bucket->data = strtoupper($bucket->data);
// Append the modified bucket to the output stream
stream_bucket_append($out, $bucket);
// Update the consumed counter
$consumed += $bucket->datalen;
}
// Let PHP know we've processed the data
return PSFS_PASS_ON;
}
}
// Register the custom filter
stream_filter_register('uppercase', 'UppercaseFilter');
// Open a stream with the filter applied
$stream = fopen('php://temp', 'w+');
stream_filter_append($stream, 'uppercase');
// Write some data to the stream
fwrite($stream, 'hello, world!');
// Rewind the stream pointer to read the modified data
rewind($stream);
// Read and output the modified data
echo stream_get_contents($stream);
// Close the stream
fclose($stream);
?>
Ví dụ stream_socket_server:
Tạo file stream_socket_server.php:
<?php
// Server address and port
$address = '127.0.0.1';
$port = 8080;
// Create a TCP/IP socket
$socket = stream_socket_server("tcp://$address:$port", $errno, $errstr);
if (!$socket) {
echo "Failed to create socket: $errstr ($errno)\n";
} else {
echo "Server started at $address:$port\n";
// Accept incoming connections
while ($conn = stream_socket_accept($socket, -1)) {
// Handle client connection
echo "Client connected: " . stream_socket_get_name($conn, true) . "\n";
// Send a welcome message to the client
fwrite($conn, "Welcome to the server!\n");
// Read data from the client
$data = fread($conn, 1024);
// Process client data (echo back in this case)
if ($data) {
echo "Received: $data\n";
fwrite($conn, "You sent: $data");
}
// Close the connection
fclose($conn);
echo "Client disconnected.\n";
}
// Close the server socket
fclose($socket);
}
?>
Tạo file tương tác với server client.php:
<?php
// Server address and port
$serverAddress = '127.0.0.1';
$serverPort = 8080;
// Create a TCP/IP socket
$socket = stream_socket_client("tcp://$serverAddress:$serverPort", $errno, $errstr, 30);
if (!$socket) {
echo "Failed to connect to server: $errstr ($errno)\n";
} else {
echo "Connected to server.\n";
// Read the welcome message from the server
echo "Server: " . fread($socket, 1024) . "\n";
// Send data to the server
fwrite($socket, "Hello, server! This is the client.");
// Read the response from the server
echo "Server response: " . fread($socket, 1024) . "\n";
// Close the client socket
fclose($socket);
echo "Disconnected from server.\n";
}
?>
Ví dụ stream_supports_lock:
<?php
$fileStream = fopen('test.txt', 'r');
if (stream_supports_lock($fileStream)) {
echo "The stream supports locking.";
} else {
echo "The stream does not support locking.";
}
fclose($fileStream);
?>
Ví dụ stream_wrapper_register:
<?php
class VariableStream {
private $position = 0;
private $data = "";
public function stream_open($path, $mode, $options, &$opened_path) {
// Initialize stream data (e.g., read from a file or database)
$this->data = "line1\nline2\nline3\n";
return true;
}
public function stream_read($count) {
$chunk = substr($this->data, $this->position, $count);
$this->position += strlen($chunk);
return $chunk;
}
public function stream_write($data) {
// Handle writing to the stream (e.g., append to $this->data)
$this->data .= $data;
return strlen($data);
}
public function stream_eof() {
// Implement stream_eof method (end-of-file check)
return $this->position >= strlen($this->data);
}
// Implement other necessary methods (stream_seek, stream_tell, etc.)
public function stream_seek($offset, $whence) {
// Implement stream_seek method (seek to a new position)
switch ($whence) {
case SEEK_SET:
$this->position = $offset;
break;
case SEEK_CUR:
$this->position += $offset;
break;
case SEEK_END:
$this->position = strlen($this->data) + $offset;
break;
}
return true;
}
public function stream_tell() {
// Implement stream_tell method (get current position)
return $this->position;
}
}
// Register the custom stream wrapper
stream_wrapper_register("var", "VariableStream");
// Open a stream using the "var://myvar" URL
$fp = fopen("var://myvar", "r+");
// Write some data to the stream
fwrite($fp, "new line\n");
// Rewind the stream
rewind($fp);
// Read and echo the contents of the stream
while (!feof($fp)) {
echo fgets($fp);
}
// Close the stream
fclose($fp);
?>
Ví dụ stream_socket_shutdown:
<?php
// Create a TCP/IP socket client
$socket = stream_socket_client('tcp://example.com:80', $errno, $errstr, 30);
if (!$socket) {
echo "Failed to connect: $errstr ($errno)\n";
} else {
// Send a request to the server
$request = "GET / HTTP/1.1\r\nHost: example.com\r\nConnection: close\r\n\r\n";
fwrite($socket, $request);
// Read and output the server response
while (!feof($socket)) {
echo fread($socket, 8192);
}
// Shutdown writing part of the socket
stream_socket_shutdown($socket, STREAM_SHUT_WR);
// Close the socket
fclose($socket);
}
?>
Ví dụ stream_wrapper_restore và stream_wrapper_unregister:
<?php
class VariableStream {
private $position = 0;
private $data = "";
public function stream_open($path, $mode, $options, &$opened_path) {
// Initialize stream data (e.g., read from a file or database)
$this->data = "line1\nline2\nline3\n";
return true;
}
public function stream_read($count) {
$chunk = substr($this->data, $this->position, $count);
$this->position += strlen($chunk);
return $chunk;
}
public function stream_write($data) {
// Handle writing to the stream (e.g., append to $this->data)
$this->data .= $data;
return strlen($data);
}
public function stream_eof() {
// Implement stream_eof method (end-of-file check)
return $this->position >= strlen($this->data);
}
// Implement other necessary methods (stream_seek, stream_tell, etc.)
public function stream_seek($offset, $whence) {
// Implement stream_seek method (seek to a new position)
switch ($whence) {
case SEEK_SET:
$this->position = $offset;
break;
case SEEK_CUR:
$this->position += $offset;
break;
case SEEK_END:
$this->position = strlen($this->data) + $offset;
break;
}
return true;
}
public function stream_tell() {
// Implement stream_tell method (get current position)
return $this->position;
}
}
// Register the custom stream wrapper
stream_wrapper_register("var", "VariableStream");
// Open a stream using the "var://myvar" URL
$fp = fopen("var://myvar", "r+");
// Write some data to the stream
fwrite($fp, "new line\n");
// Rewind the stream
rewind($fp);
// Read and echo the contents of the stream
while (!feof($fp)) {
echo fgets($fp);
}
// Close the stream
fclose($fp);
// Assume we have previously unregistered the "var" protocol
// using stream_wrapper_unregister (if it existed)
$existed = in_array("var", stream_get_wrappers());
// Restore the original "var" protocol if it was previously registered
if ($existed) {
stream_wrapper_restore("var");
}
// Now you can use the "var://" protocol again
$restoredFp = fopen("var://myvar", "r+");
fwrite($restoredFp, "Restored stream wrapper!\n");
rewind($restoredFp);
echo "\nAfter restoring:\n";
while (!feof($restoredFp)) {
echo fgets($restoredFp);
}
fclose($restoredFp);
?>
Ví dụ stream_copy_to_stream:
<?php
// Assume we have a source stream (e.g., reading from a file)
$src = fopen("test1.txt", "r");
// Create a destination stream (e.g., writing to a file)
$dest = fopen("test2.txt", "w");
// Copy 1024 bytes from the source stream to the destination stream
echo stream_copy_to_stream($src, $dest, 1024) . " bytes copied to test2.txt\n";
// Close both streams
fclose($src);
fclose($dest);
?>
Ví dụ:
$fp = fsockopen("www.example.com", 80);
if (!$fp) {
echo "Unable to open connection";
} else {
fwrite($fp, "GET \/ HTTP\/1.0");
stream_set_timeout($fp, 2);
$res = fread($fp, 2000);
$info = stream_get_meta_data($fp);
fclose($fp);
if ($info['timed_out']) {
echo "Connection timed out!";
} else {
echo $res;
}
}
var_dump(stream_is_local("www.example.com"));
echo "<br>";
var_dump(stream_is_local("/etc"));
Hàm do người dùng định nghĩa (user defined functions)
Mặc dù PHP có nhiều hàm dựng sẵn nhưng người dùng vẫn có thể tạo các hàm tùy chỉnh cho các mục đích sử dụng khác nhau. Không giống như các chức năng tích hợp sẵn có sẵn, các hàm do người dùng xác định được tạo bởi người dùng.
Các hàm do người dùng định nghĩa có thể được định nghĩa là những chức năng được tạo bởi người dùng tùy thuộc vào yêu cầu của họ để hoàn thành một tác vụ cụ thể.
Tuy nhiên, có thể phát sinh các tình huống trong đó không chức năng tích hợp sẵn nào có thể phục vụ mục đích này. Trong những trường hợp như vậy, với các hàm do người dùng định nghĩa, người dùng có thể tạo các hàm theo tác vụ sẽ thực hiện.
Tạo một hàm do người dùng định nghĩa trong PHP
Một số quy tắc cần tuân thủ:
- Tên của hàm chỉ được bao gồm bảng chữ cái, số và dấu gạch dưới, tên hàm không chứa ký tự đặc biệt.
- Tên hàm phải bắt đầu bằng bảng chữ cái hoặc dấu gạch dưới. Một số không thể được sử dụng ở đầu tên hàm.
- Tên hàm có phân biệt chữ hoa – thường.
- Sau tên hàm, sử dụng dấu ngoặc tròn mở và đóng ( ), bên trong dấu ngoặc này là tham số truyền vào (nếu có)
- Cuối cùng, sử dụng dấu ngoặc nhọn mở { để chỉ định phần mở đầu viết mã hàm và kết thúc bằng dấu ngoặc nhọn đóng }
Cú pháp hàm không có tham số:
function functionName(){
// todo
}
Ví dụ:
function say_hello() {
echo "Hello!";
}
// Call the function
say_hello();
Đối số và tham số trong hàm PHP (arguments and parameters)
Đối với một hàm, người dùng có thể viết một hoặc nhiều tham số (parameter) mà họ có thể truyền đối số (argument) trong khi gọi hàm. Các đối số có thể được sử dụng để cung cấp dữ liệu cho các chức năng. Một đối số tương tự như một biến. Để chuyển một đối số cho một hàm, người dùng có thể chỉ định nó trong dấu ngoặc đơn ngay sau tên hàm. Người dùng có thể chuyển bao nhiêu tham số theo yêu cầu bằng cách tách từng tham số bằng dấu phẩy.
Ví dụ:
function displayStudentInfo($name, $age, $gradeLevel) {
echo "Name: " . $name . "<br>";
echo "Age: " . $age . "<br>";
echo "Grade Level: " . $gradeLevel;
}
// Call the function with arguments
displayStudentInfo("John Doe", 16, 11);
/* Output:
Name: John Doe
Age: 16
Grade Level: 11
*/
Giá trị đối số mặc định trong hàm (default argument value)
Đối số chức năng đóng một vai trò quan trọng trong việc thực thi mã chức năng. Có những trường hợp khi người dùng có thể quên truyền đối số trong khi gọi hàm, điều này có thể dẫn đến kết quả không mong muốn, Do đó, để tránh những trường hợp như vậy, một giá trị mặc định được gán cho các đối số, Giá trị như vậy được gọi là giá trị đối số mặc định (default argument value). Giá trị này sẽ được sử dụng nếu không có giá trị nào được nhập cho đối số khi hàm được thực thi.
Ví dụ:
function student_property($name, $age, $gender = "unknown") {
echo "Name: $name | Age: $age | Gender: $gender <br>";
}
// Calling the function with all three arguments passed
student_property("John Doe", 19, "Male");
// Calling the function with two arguments, and utilizing the default argument value for gender
student_property("Jane Smith", 20);
// Calling the function with all three arguments passed again
student_property("Alex Patel", 21, "Female");
Đây là một ví dụ về hàm student_property() chuyển vào tên, tuổi và giới tính của một sinh viên. Tham số giới tính đã được cung cấp một giá trị mặc định là “unknown” và sẽ được sử dụng nếu không có đối số nào được chuyển rõ ràng cho hàm. Bạn có thể thấy điều này hoạt động như thế nào bằng cách chạy mã và quan sát đầu ra.
Từ khóa return trong hàm
Một khía cạnh quan trọng của các hàm PHP là chúng cũng có thể trả về kết quả. Ví dụ: nếu có một hàm được xác định để thực hiện các phép tính toán học nhất định, người dùng có thể muốn trả lại kết quả của các phép tính cho chương trình gọi. Trong những trường hợp như vậy, khi hàm được gọi, kết quả của hàm có thể được lấy trong câu lệnh gọi.
Để làm điều này, người dùng có thể sử dụng lệnh return bên trong thân hàm làm câu lệnh cuối cùng của hàm. Nó giúp trả về bất kỳ biến hoặc giá trị nào từ một hàm. Lưu ý rằng chỉ có thể trả về một biến/giá trị. Từ khóa return không thể được theo sau bởi nhiều giá trị.
Ví dụ:
function addNumbers($num1, $num2) {
$sum = $num1 + $num2;
return $sum;
}
// Call the function and store the result in a variable
$total = addNumbers(5, 10);
// Output the result
echo "The total is: " . $total;
Khai báo kiểu trả về
PHP 8 cung cấp một tính năng mới được gọi là khai báo kiểu cho lệnh return. Tương tự như khai báo kiểu cho đối số hàm, nếu yêu cầu nghiêm ngặt được bật, mã sẽ hiển thị ‘Lỗi nghiêm trọng’ (fatal error) trong trường hợp kiểu không khớp.
Để thực hiện khai báo kiểu cho một hàm trả về, trong khi tạo hàm, người dùng phải chèn thêm dấu hai chấm (:) và gõ trước dấu ngoặc mở “{“
Ví dụ:
declare(strict_types=1); // strict requirement
function multiply(float|int $num1, float|int $num2) : float {
return $num1 * $num2;
}
multiply(6,8);
Hàm này nhận hai tham số, $num1 và $num2, cả hai đều có thể là kiểu dữ liệu float hoặc int. Thân hàm nhân hai số và trả về kết quả dưới dạng float.
Cú pháp : float ở cuối phần khai báo hàm được sử dụng để chỉ ra rằng hàm này sẽ luôn trả về giá trị float. Nếu hàm được gọi và không trả về giá trị float, chẳng hạn như nếu nó trả về giá trị int, string hoặc null, thì PHP sẽ đưa ra lỗi kiểu dữ liệu (type error).
Truyền đối số theo tham chiếu (pass by reference)
Trong PHP, các đối số có thể được truyền bằng một trong hai cách sau:
- Truyền tham trị (pass by value)
- Truyền tham chiếu (pass by reference)
Nói chung trong PHP, mặc định các đối số được truyền theo giá trị (truyền tham trị). Điều này có nghĩa là một bản sao của giá trị được sử dụng trong hàm và biến thực được truyền vào hàm không bị sửa đổi.
Tuy nhiên, nếu một đối số hàm được truyền theo tham chiếu, bất kỳ sửa đổi nào được thực hiện đối với đối số trong hàm sẽ tự động sửa đổi biến được truyền. Để thay đổi đối số hàm thành tham chiếu, người dùng có thể sử dụng toán tử &. (Tương tự khái niệm con trỏ – pointer trong C/C++).
Ví dụ:
function increment(&$num) {
$num++;
}
$num = 5;
increment($num);
echo $num; // Output: 6
Gọi hàm động (Dynamic Function Calls)
PHP cho phép người dùng phân bổ tên hàm dưới dạng chuỗi cho các biến và sau đó sử dụng các biến này theo cách giống như tên hàm.
Ví dụ:
function add($num1, $num2) {
return $num1 + $num2;
}
$func_name = "add";
$num1 = 5;
$num2 = 10;
$result = $func_name($num1, $num2);
echo $result; // Output: 15
Trong ví dụ này, chúng ta định nghĩa một hàm add nhận hai đối số và trả về tổng của chúng. Sau đó, chúng ta khai báo một biến chuỗi $func_name và đặt nó thành tên của hàm mà chúng ta muốn gọi. Tiếp theo, chúng ta xác định hai biến $num1 và $num2 chứa các giá trị mà chúng ta muốn chuyển làm đối số cho hàm.
Cuối cùng, bằng cách sử dụng các lời gọi hàm động, chúng ta gọi hàm có tên được lưu trữ trong biến $func_name và chuyển vào các giá trị của $num1 và $num2. Giá trị trả về của hàm được lưu trữ trong biến $result, sau đó chúng ta sẽ in ra màn hình.
Các lệnh gọi hàm động có thể hữu ích khi bạn cần gọi một hàm động trong thời gian chạy hoặc nếu bạn muốn tạo mã linh hoạt hơn và có thể tái sử dụng.
Đối số được đặt tên (Named argument)
Named argument là một tính năng mới được giới thiệu trong PHP 8.0. Nó cho phép người dùng truyền đối số cho một hàm chỉ xem xét tên tham số chứ không phải vị trí tham số, Điều này cho phép người dùng truyền đối số mà không cần quan tâm đến vị trí của tham số. Họ có thể chỉ cần chỉ định tên chính xác của các tham số và truyền giá trị cho hàm.
Ví dụ:
function printStudentDetails(string $name, int $age, string $major) {
echo "Name: $name <br>";
echo "Age: $age <br>";
echo "Major: $major <br>";
}
// Call the function using named arguments
printStudentDetails(major: 'Computer Science', name: 'John Doe', age: 21);
Trong ví dụ này, chúng ta đã định nghĩa một hàm printStudentDetails nhận ba tham số. Khi gọi hàm, thay vì truyền các đối số theo vị trí của chúng, chúng ta có thể truyền chúng bằng cách sử dụng các tên chẳng hạn như major: ‘Computer Science’. Bằng cách này, ngay cả khi chúng ta có nhiều đối số, chúng ta không cần phải lo lắng về thứ tự của chúng. Chúng ta chỉ cần cung cấp tên cùng với giá trị của chúng, và tất nhiên, tên cung cấp cần phải so khớp với biến.
Lưu ý rằng các đối số được đặt tên chỉ khả dụng trong PHP 8 và các phiên bản mới hơn.
Hàm date() và time()
Hàm date()
Hàm PHP date() hiển thị ngày và/hoặc thời gian hiện tại của máy chủ. Chức năng này giúp người dùng định dạng lại timestamp nhất định sao cho ngày và giờ dễ đọc hơn. Timestamp có thể được định nghĩa là một chuỗi ký tự, biểu thị ngày và/hoặc thời gian diễn ra một sự kiện cụ thể.
Xem thêm: https://www.php.net/manual/en/function.date.php
Cú pháp:
date(format,timestamp);
Tham số format cho biết ngày phải được định dạng như thế nào. Để thực hiện định dạng bổ sung, người dùng có thể sử dụng các ký tự như ‘/’, ‘.’, ‘-‘ giữa các ký tự.
Ví dụ:
<?php
$currentDate = date('Y-m-d H:i:s'); // example output: 2021-05-25 15:38:22
$dateOnly = date('m/d/Y'); // example output: 05/25/2021
$timeOnly = date('h:i A'); // example output: 03:38 PM
$year = date('Y'); // example output: 2021
$month = date('F'); // example output: May
$dayOfWeek = date('l'); // example output: Tuesday
echo "Current Date: $currentDate <br>";
echo "Date Only: $dateOnly <br>";
echo "Time Only: $timeOnly <br>";
echo "Year: $year <br>";
echo "Month: $month <br>";
echo "Day of Week: $dayOfWeek <br>";
Hàm time()
Hàm time() trong PHP hiển thị thời gian hiện tại tính bằng giây. Hàm date() giúp chuyển đổi số giây thành ngày hiện tại.
Ví dụ:
<?php
echo "Current Timestamp: " . time();
// Current Timestamp: 1630551312
?>
1 Comments