Các hàm rất hữu ích trong PHP bạn cần biết !
1/ Hàm có bao nhiêu tham số cũng đượcBạn có thể đã biết trong PHP chúng ta có thể tạo hàm với các tham số có giá trị mặc định ban đầu . Nhưng có 1 phương pháp cho phép 1 hàm chấp nhận mọi tham số !
Ví dụ đầu tiên với hàm có tham số có giá trị mặc định :
PHP:
// Hàm có 2 tham số mặc định
function foo($arg1 = '', $arg2 = '') {
echo "arg1: $arg1\n";
echo "arg2: $arg2\n";
}
foo('hello','world');
/* Xuất
arg1: hello
arg2: world
*/
foo();
/* Xuất
arg1:
arg2:
*/
Bây giờ, hãy cùng xây dựng 1 hàm có thể truyền vào mọi tham số . func_get_args() sẽ giúp chúng ta làm điều đó :
PHP:
// Tham số để rỗng nhé
function foo() {
// returns an array of all passed arguments
$args = func_get_args();
foreach ($args as $k => $v) {
echo "arg".($k+1).": $v\n";
}
}
foo();
/* Không xuất gì cả */
foo('hello');
/* Xuất
arg1: hello
*/
foo('hello', 'world', 'again');
/* Xuất
arg1: hello
arg2: world
arg3: again
*/
2/ Sử dụng GLOB() để tìm files
Nhiều hàm trong PHP có tên dài và có tính mô tả chức năng của nó . Tuy nhiên, thật khó để nói hàm glob() có nhiệm vụ gì nếu chúng ta chưa từng sử dụng qua .
Thật ra, glob() có chức năng như hàm scandir() nhưng là 1 phiên bản cao cấp hơn ~~
PHP:
// Lấy hết tất cả các file đuôi .php
$files = glob('*.php');
print_r($files);
/* Xuất
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
)
*/
Bên cạnh đó, chúng ta có thể lấy ra nhiều file :
PHP:
// Lấy tất cả file có đuôi .php và .txt
//GLOB_BRACE : ở trong {} sẽ dc hiểu là hoặc << hoặc php hoặc txt thì lấy ra
$files = glob('*.{php,txt}', GLOB_BRACE);
print_r($files);
/* Xuất
Array
(
[0] => phptest.php
[1] => pi.php
[2] => post_output.php
[3] => test.php
[4] => log.txt
[5] => test.txt
)
*/
File cũng có thể được lấy ra với đường dẫn :
PHP:
$files = glob('../images/a*.jpg');
print_r($files);
/* Xuất
Array
(
[0] => ../images/apple.jpg
[1] => ../images/art.jpg
)
*/
Còn nếu bạn muốn lấy đường dẫn đầy đủ, chỉ cần dùng realpath() :
PHP:
$files = glob('../images/a*.jpg');
// sử dụng hàm đến mỗi phần tử mảng
$files = array_map('realpath',$files);
print_r($files);
/* output looks like:
Array
(
[0] => C:\wamp\www\images\apple.jpg
[1] => C:\wamp\www\images\art.jpg
)
*/
3/ Thông tin bộ nhớ được sử dụng
Nếu biết được thời gian chạy script, bạn sẽ tối ưu code tốt hơn !
PHP có 1 bộ xử lý bộ nhớ rất phức tạp . Sự sử dụng bộ nhớ của đoạn script có thể tăng, giảm trong khi nó nó chạy . Để lấy bộ nhớ hiện tại đang được sử dụng, chúng ta dùng memory_get_usage() , để lấy bộ nhớ maximum được sử dụng trong cả quá trình, dùng memory_get_peak_usage() :
PHP:
echo "Ban đầu: ".memory_get_usage()." bytes \n";
/* prints
Ban đầu: 361400 bytes
*/
// Sử dụng bộ nhớ nào
for ($i = 0; $i < 100000; $i++) {
$array []= md5($i);
}
// Loại bỏ mảng
for ($i = 0; $i < 100000; $i++) {
unset($array[$i]);
}
echo "Cuối cùng : ".memory_get_usage()." bytes \n";
/* Xuất
Cuối cùng: 885912 bytes
*/
echo "Cao nhất: ".memory_get_peak_usage()." bytes \n";
/* Xuất
Cao nhất: 13687072 bytes
*/
4/Magic Constants
PHP cung cấp một số magic_constants hữu ích như :
lấy ra dòng hiện tại (__FILE__), lấy ra đường dẫn hiện tại (__FILE__), lấy ra thư mục (__DIR__), tên hàm (__FUNCTION__), tên lớp (__CLASS__), tên method ( __METHOD__) và namespace (__NAMESPACE__)
Chúng ta sẽ hok đi từng constant, mà chỉ giới thiệu 1 vài ví dụ hữu ích :
PHP:
// đây là đường dẫn tương đối
// Có thể bạn sẽ gặp lỗi nếu chạy script từ thư mục khác đấy nhé
require_once('config/database.php');
require_once(dirname(__FILE__) . '/config/database.php');
Bạn hãy chạy script trên, đừng tạo file database.php trong folder config nhé, để hiểu __FILE__ có nhiệm vụ gì, bạn cứ việc copy->paste-> chạy . Bạn sẽ thấy lỗi chưa ?
Nếu thấy rồi, bạn đảo thứ tự của 2 dòng require_once() trên, bạn chạy lại và sẽ hiểu ^^
Lưu ý : nên sử dụng __FILE__ khi include script khác bạn nhé .
Sử dụng __LINE__ sẽ giúp chúng ta debug dễ hơn . Bạn có thể tìm ra số thứ tự của dòng :
PHP:
// some code
// ...
my_debug("some debug message", __LINE__);
/* Xuất
Line 4: some debug message
*/
// some more code
// ...
my_debug("another debug message", __LINE__);
/* Xuất
Line 11: another debug message
*/
function my_debug($msg, $line) {
echo "Line $line: $msg\n";
}
5/ Tạo ID đặc biệt :
Có 1 vài trường hợp chúng ta cần phải tạo ra những chuỗi đặc biệt ( không trùng lặp ), người ta thường dùng md5() để làm điều này, nhưng md5() không thực sự sinh ra để làm điều đó !
PHP:
// generate unique string
echo md5(time() . mt_rand(1,1000000));
Có 1 hàm chuyên dùng để xử lý điều đó trong PHP tên là : uniqid()
PHP:
// Tạo chuỗi đặc biệt
echo uniqid();
/* Xuất
4bd67c947233e
*/
// Tạo 1 chuỗi đặc biệt khác
echo uniqid();
/* Xuất
4bd67c9472340
*/
Có thể bạn đang thắc mắc rằng dù hàm tạo chuỗi đặc biệt nhưng có 1 số kí tự đâu tiên giống hệt nhau mỗi khi chạy ! Bởi vì việc tạo chuỗi này phụ thuộc vào thời gian server .
Để giảm cơ hội chúng có thể y chang nhau, chúng ta thêm prefix vào :
PHP:
// với prefix
echo uniqid('foo_');
/* Xuất
foo_4bd67d6cd8b8f
*/
// với nhiều kí tự hơn
echo uniqid('',true);
/* Xuất
4bd67d6cd8b926.12135106
*/
// prefix và nhiều kí tự hơn
echo uniqid('bar_',true);
/* Xuất
bar_4bd67da367b650.43684647
*/
Hàm này sẽ tạo chuỗi với số kí tự ít hơn md5(), sẽ giúp bạn tiết kiệm thời gian hơn .
6/ Serialization
Bạn đã bao giờ lưu 1 biến phức tạp vào database hay file ? Bạn không cần phải có những giải pháp của mình để chuyển đổi mảng về dạng chuỗi rồi nạp vào, bởi vì PHP đã có vào hàm dùng với mục đích này !
Chúng ta sẽ tìm hiểu 2 hàm : serialize() và unserialize()
PHP:
// 1 mảng phức tạp
$myvar = array(
'hello',
42,
array(1,'two'),
'apple'
);
// convert to a string
$string = serialize($myvar);
echo $string;
/* Xuất
a:4:{i:0;s:5:"hello";i:1;i:42;i:2;a:2:{i:0;i:1;i:1;s:3:"two";}i:3;s:5:"apple";}
*/
// Bạn có thể lấy lại mảng ban đầu
$newvar = unserialize($string);
print_r($newvar);
/* Xuất
Array
(
[0] => hello
[1] => 42
[2] => Array
(
[0] => 1
[1] => two
)
[3] => apple
)
*/
Tuy nhiên, từ khi JSON trở nên phổ biến, họ đã quyết định thêm sự hỗ trợ vào PHP5.2 . Bây giờ bạn có thể sử dụng json_encode() và json_decode() :
PHP:
// Mảng phức tạp
$myvar = array(
'hello',
42,
array(1,'two'),
'apple'
);
// Chuyển đổi mảng thành string
$string = json_encode($myvar);
echo $string;
/* Xuất
["hello",42,[1,"two"],"apple"]
*/
// Lấy lại mảng ban đầu
$newvar = json_decode($string);
print_r($newvar);
/* Xuất
Array
(
[0] => hello
[1] => 42
[2] => Array
(
[0] => 1
[1] => two
)
[3] => apple
)
*/
Có vẻ 2 hàm này nhỏ gọn hơn nhỉ ^^ . Hơn thế nữa, chúng tương thích với javascript và 1 số ngôn ngữ khác . Tuy nhiên, cho những đối tượng phức tạp quá, có thể sẽ bị mất thông tin đấy !
7/ Nén chuỗi
Khi nói về sự nén, chúng ta cứ nghĩ là nến file zip !! Nhưng chúng ta hoàn toàn có thể nén 1 chuỗi phức tạp trong PHP .
Ở ví dụ sau đây, chúng ta sẽ dùng hàm gzcompress() và gzuncompress()
PHP:
$string =
"Lorem ipsum dolor sit amet, consectetur
adipiscing elit. Nunc ut elit id mi ultricies
adipiscing. Nulla facilisi. Praesent pulvinar,
sapien vel feugiat vestibulum, nulla dui pretium orci,
non ultricies elit lacus quis ante. Lorem ipsum dolor
sit amet, consectetur adipiscing elit. Aliquam
pretium ullamcorper urna quis iaculis. Etiam ac massa
sed turpis tempor luctus. Curabitur sed nibh eu elit
mollis congue. Praesent ipsum diam, consectetur vitae
ornare a, aliquam a nunc. In id magna pellentesque
tellus posuere adipiscing. Sed non mi metus, at lacinia
augue. Sed magna nisi, ornare in mollis in, mollis
sed nunc. Etiam at justo in leo congue mollis.
Nullam in neque eget metus hendrerit scelerisque
eu non enim. Ut malesuada lacus eu nulla bibendum
id euismod urna sodales. ";
$compressed = gzcompress($string);
echo "Size ban đầu: ". strlen($string)."\n";
/* Xuất
Size ban đầu: 800
*/
echo "Size sau khi nén: ". strlen($compressed)."\n";
/* Xuất
Size sau khi nén: 418
*/
// Lấy lại chuỗi ban đầu
$original = gzuncompress($compressed);
Chúng ta có thể tiết kiệm tới 50% tổng kích thước đấy ! Bên cạnh đó, 2 hàm gzencode() và gzdecode() cũng làm điều tương tự nhưng dùng thuật toán khác thôi .
8/ Đăng kí 1 hàm shutdown
Với hàm register_shutdown_function(), chúng ta có thể làm 1 vài chuyện trước khi script ngừng chạy .
Ví dụ đếm thời gian chạy script nè :
PHP:
// Lấy thời gian bắt đầu chạy
$start_time = microtime(true);
// Code ở đây
// ...
// Xuất code đã chạy được bao lâu rồi
echo "Thời gian chạy script : ".
(microtime(true) - $start_time).
" seconds.";
Với cái nhìn đầu tiên, có thể bạn thấy thật tầm thường !! Đoạn code trên chỉ là thêm đoạn code tính thời gian ở cuối script . Tuy nhiên, nếu bạn gọi hàm exit() , đoạn code trên sẽ hok bao giờ chạy được . Thay vào đó, nó sẽ thông báo lỗi , hoặc là khi script bạn bị kết thúc bởi người dùng, bằng cách nhấn nút stop trên trình duyệt chẳng hạn !!!
Khi bạn sử dụng register_shutdown_function(), đoạn code của bạn sẽ chạy bất kể nó bị ngừng đột xuất vì lí do gì !
PHP:
$start_time = microtime(true);
register_shutdown_function('my_shutdown');
// Code ở đây
// ...
function my_shutdown() {
global $start_time;
echo "Thời gian chạy script : ".
(microtime(true) - $start_time).
" seconds.";
}
Chúc các bạn thành công!