Advertisement
  1. Code
  2. PHP

Tăng Cường Hiệu Suất Bằng Cách Tạo Ra Những Hàm PHP Helper

Scroll to top
Read Time: 16 min

() translation by (you can also view the original English article)

Mỗi nhân công cần một bộ dụng cụ tốt, và nhà phát triển web cũng không ngoại lệ. Các hàm PHP Helper được thiết kế để tăng tốc và đồng nhất các công việc lặp đi lặp lại, và làm cho cuộc sống của bạn dễ dàng hơn. Bài hướng dẫn đầu tiên giải thích làm sao để tạo helper liên kết, nó sẽ cải thiện các phương thức của bạn để bổ sung siêu liên kết và liên kết mailto trong ứng dụng web của bạn.


Giới thiệu

Vâng, chẳng có gì tuyệt như những thiết bị tiết kiệm thời gian, chúng làm cuộc sống dễ dàng hơn. Có nhiều công cụ hữu dụng ngoài kia có thể cải thiện quá trình làm việc của bạn, từ lưới CSS và bố cục đến những hệ thống quản lý nội dung toàn diện và các framework.

Tuy nhiên, bài hướng dẫn này sẽ đào sâu vào khái niệm của các hàm PHP Helper, và cách bạn có thể viết những mã lệnh sẵn cho trang của bạn mà bạn có thể dùng được nhiều lần. Đó là những hàm sẽ tăng tốc và dọn sạch sẽ quá trình viết mã lệnh của bạn, vì thì các công việc lặp đi lặp lại có thể được tối thiểu hoá và bạn có thể dành nhiều thời gian cho những việc quan trọng khác trong cuộc sống...như là ăn tối.


Các helper về siêu liên kết

Một trong những nhiệm vụ lặp đi lặp lại mà chúng ta thường phải viết là các siêu liên kết. Bằng cách tạo ra một hàm helper cho nó chúng ta có thể tiết kiệm thời gian bất cứ khi nào chúng ta cần viết nó, xoá bỏ các lỗi về cú pháp, và chắc chắn các mã lệnh dễ cập nhật nếu file đó bị di chuyển, hoặc nếu bạn đang đưa trang của bạn sang một domain mới. Để bắt đầu, chúng tôi sẽ tạo ra một hàm đơn giản trong một file gọi là helpers.php:

1
<?php 
2
function get_domain()
3
{
4
  //the variable $domain can be set to the domain your application is running from. 

5
	$domain = "https://www.my-site-domain.com/";
6
   	return $domain;
7
}

Hàm nhỏ bé này được dùng đến bất cứ khi nào bạn cần lấy toàn bộ đường dẫn đến một file, và có thể được tham vấn lại nhiều lần trong suốt quá trình phát triển. Đây là một phương pháp hữu dụng hơn là chỉ đơn giản gọi tên domain với phương pháp $_SERVER['HTTP_HOST'], bởi vì nó sẽ không thay đổi nếu ai đó gõ vào tên domain có hoặc không có "www" và vẫn hiệu quả nếu trang của bạn nằm trên một sub-domain (tên miền thứ cấp), ví dụ "http://localhost/my-site".

Nó cũng cực kỳ hữu ích khi chuyển đổi toàn site, bởi vì tất cả đường dẫn tuyệt đối sẽ được tham chiếu về hàm này, vì vậy thay đổi biến số $domain sang một tên miền mới sẽ thay đổi toàn bộ các liên kết toàn trang, chỉ trong một lần.


Hợp nhất các mã đó

Điều chúng ta hướng tới là tạo một hàm mới gọi là "anchor", nó sẽ xuất ra một chuỗi html chuẩn, phù hợp, cùng với một tiêu đề. Đây là một ví dụ của cái mà chúng ta sẽ tạo ra:

1
<a href="http://www.my-site-domain.com/new-page.php" title="New Page">New Page</a>

Và đây là điều mà chúng ta thực sự nhập vào:

1
echo anchor('new-page.php','New Page');

Vì vậy ở đây chúng ta có hàm PHP được tham chiếu, nó có hai biến số được đưa vào: một cho liên kết, và một để hiển thị nội dung chữ. Vậy bây giờ, trong file helpers.php, chúng ta có thể bắt đầu viết hàm mới này:

1
function anchor($link, $text) // 1

2
{
3
	$domain = get_domain(); // 2

4
    $link = $domain . $link; // 3

5
	
6
    $data = '<a href="' . $link . '"';
7
	$data .= ' title="' . $text . '"'; //4

8
	$data .= '>';
9
	$data .= $text; //4

10
	$data .= "</a>";
11
	
12
	return $data;
13
}
  1. Ở đây, chúng ta thiết lập hàm "anchor" với hai biến số được đưa vào:
  2. Chúng tôi sau đó lấy tên domain từ hàm get_domain() đã được tạo ra
  3. Tiếp đến, chúng tôi nối thêm vào biến $link đã được đưa vào hàm.
  4. Sau đó chúng tôi bắt đầu tạo ra chuỗi string trong một biến số gọi là $data, và sử dụng biến $text để nhân đôi cả phần chữ cho trang, cũng như thẻ title cho liên kết.

Bây giờ chúng ta có thể kiểm tra. Tạo một file mới gọi là index.php, trong cùng một thư mục với file helpers.php, và gõ vào:

1
require('helpers.php');
2
echo anchor('new-page.php','New Page');

Ở đây, chúng ta kết nối 2 file bằng hàm require(), và sau đó gọi hàm anchor(), gửi 2 giá trị biến đến hàm này. Nếu bạn kiểm tra nó trên một trình duyệt bạn sẽ thấy kết quả mong đợi:

1
<a href="http://www.my-site-domain.com/new-page.php" title="New Page">New Page</a>

Biến nó trở nên linh hoạt

Hàm đơn giản này có thể hữu dụng, nhưng không nghi ngờ gì khi nó sẽ sớm trở nên hạn chế. Chúng ta cần thêm vào 3 tính năng trước khi nó trở nên tuyệt vời và linh hoạt hơn; đầu tiên, một chọn lựa để thêm các thẻ title; thứ hai, để có thể thêm các quy tắc CSS, và thứ ba, một tuỳ chọn để mở nó ở cửa sổ mới, nếu cần thiết.

Hãy xét duyệt thẻ title trước tiên. Các thẻ title rất quan trọng trong các mục đích SEO, và nếu bạn không đặt nó vào các liên kết đúng thời điểm, tôi thực sự khuyến nghị để nó trở thành thói quen từ bây giờ. Hàm này sẽ giúp thúc ép bạn làm như vậy -- thực tế, sẽ dễ dàng hơn nhiêu khi bổ sung vào, và nếu bạn chưa từng làm theo cách thủ công, thì một bản copy mặc định của phần chữ hiển thị sẽ được sử dụng thay vào đó.

1
function anchor($link, $text, $title) //1

2
{
3
	$domain = get_domain();
4
	$link = $domain . $link;
5
	$data = '<a href="' . $link . '"';
6
	
7
	if ($title) //2

8
	{
9
		$data .= ' title="' . $title . '"'; //3

10
	}
11
	else
12
	{
13
		$data .= ' title="' . $text . '"'; //4

14
	}
15
		
16
	$data.= '>';
17
	
18
	$data .= $text;
19
	$data .= "</a>";
20
	
21
	return $data;
22
}

Vì thế ở đây là một phiên bản đã được chỉnh sửa và cải tiến của hàm anchor().

  1. Giờ chúng ta thêm vào biến số thứ 3, $title.
  2. Sau đó, chúng ta chạy một đoạn kiểm tra để xem thẻ title đã được nhập vào hay chưa.
  3. Nếu nó được nhập vào, chúng tôi thêm vào một phần cho phần kết quả $data đã thiết lập thẻ title3.
  4. Nếu không có gì được nhập vào, nó sẽ mặc định lấy nội dung chữ trước đó từ biến $title cho thẻ title.

Bây giờ, nếu chúng ta thay đổi hàm gọi trong index.php thành:

1
echo anchor('new-page.php','New Page','Custom Title Message!');

Chúng ta sẽ có một kết quả thoã mãn sau:

1
<a href="http://www.my-site-domain.com/new-page.php" title="Custom Title Message!">New Page</a>

Tuỳ chọn trang trí và mục đích (target)

Để chắc rằng chúng ta vẫn có thể dùng helper này thậm chí nếu cần thêm các thẻ CSS hoặc target, chúng ta sẽ thêm một phần vào hàm của chúng ta, chúng sẽ đọc tham số thứ 4, và xuất kết qua html chính xác tương ứng.

Chúng ta cần hàm này đủ thông minh để xét xem nếu chúng ta muốn nhập vào một CSS class, một CSS ID hoặc một thẻ target, và chúng ta cũng muốn có thể nhập vào nhiều tuỳ chọn, hoặc một tuỳ chọn đơn lẻ hoặc là không có tuỳ chọn nào. Đầu tiên, hãy chỉnh sửa hàm anchort một chút:

1
function anchor($link, $text, $title, $extras)//1

2
{
3
	$domain = get_domain();
4
	$link = $domain . $link;
5
	$data = '<a href="' . $link . '"';
6
	
7
	if ($title)
8
	{
9
		$data .= ' title="' . $title . '"';
10
	}
11
	else
12
	{
13
		$data .= ' title="' . $text . '"';
14
	}
15
	
16
	if (is_array($extras))//2

17
	{
18
		foreach($extras as $rule)//3

19
		{
20
			$data .= parse_extras($rule);//4

21
		}
22
	}
23
	
24
	if (is_string($extras))//5

25
	{
26
		$data .= parse_extras($extras);//6

27
	}
28
		
29
	$data.= '>';
30
	
31
	$data .= $text;
32
	$data .= "</a>";
33
	
34
	return $data;
35
}
  1. Đầu tiên, chúng tôi bổ sung thêm biến số thứ 4, gọi là "$extras". Biến này sẽ chứa tất cả những tuỳ chọn bổ sung khác.
  2. Tiếp theo, chúng tôi kiểm tra xem nếu chúng tôi đang thêm một mảng vào trong biến số này. Chúng tôi sẽ sử dụng một mảng nếu đưa vào nhiều dữ liệu extra cho hàm, ví dụ nếu chúng ta cần có một CSS ID và một CSS class cho liên kết của chúng ta.
  3. Nếu nó là một mảng, chúng ta sẽ chạy vòng lặp qua mảng này, và thêm từng thành phần thông qua một hàm mới gọi là "parse_extras". Hàm này sẽ nhận phần extra chúng ta nhập vào, và tạo ra kết quả HTML chính xác và tương ứng.
  4. Nếu biến $extra là một string, nghĩa là chúng ta chỉ truyền vào một tuỳ biến cho nó; cho nên chúng ta có thể chạy hàm parse_extras() cho một item đơn lẻ. Rất hữu dụng, hàm is_string() trả về FALSE nếu biến là rỗng; vì thế với phần mã lệnh này, nếu không có gì được truyền vào qua biến $extra, vậy không có mã lệnh náo được thực thi, và nó sẽ bỏ qua.
  5. Bây giờ chúng ta cần tạo một hàm mới, parse_extras():

    1
    function parse_extras($rule) 
    
    2
    {
    
    3
    	if ($rule[0] == "#") //1
    
    
    4
    	{
    
    5
    		$id = substr($rule,1,strlen($rule)); //2
    
    
    6
    		$data = ' id="' . $id . '"'; //3
    
    
    7
    		return $data;
    
    8
    	}
    
    9
    	
    
    10
    	if ($rule[0] == ".") //4
    
    
    11
    	{
    
    12
    		$class = substr($rule,1,strlen($rule));
    
    13
    		$data = ' class="' . $class . '"';
    
    14
    		return $data;
    
    15
    	}
    
    16
    	
    
    17
    	if ($rule[0] == "_") //5
    
    
    18
    	{
    
    19
    		$data = ' target="' . $rule . '"';
    
    20
    		return $data;
    
    21
    	}
    
    22
    }
    

    Hàm này sử dụng với sự thật là phần extra sẽ bắt đầu với một identifier duy nhất. Nếu truyền vào CSS ID, nó sẽ bắt đầu với dấu #, nếu chúng ta truyền vào CSS class, nó sẽ bắt đầu với một đấu chấm (.), và nếu chúng ta truyền vào một thuộc tính target, nó sẽ bắt đầu với dấu gạch chân (_).

    1. Chúng ta có thể kiểm tra ký tự đầu tiên của một chuỗi là gì bằng cách dùng cú pháp $string[0]. Bạn có thể quen dùng cú pháp này để lấy giá trị đầu tiên trong một mảng, nhưng nó cũng rất hữu dụng và là một phương pháp nhanh chóng cho việc tìm ký tự cụ thể trong một chuỗi.
    2. Kế đến, ta sẽ tạo ra một biến số mới, nó là phần nhập vào $rule, với ký tự đầu tiên sẽ cắt bỏ. Bây giờ chúng ta đã xác định được rule là gì, chúng ta không còn cần nó cho kết quả HTML nữa. Sự kết hợp này của hàm substr() và strlen() là một đoạn mã hữu ích cho việc cắt bỏ ký tự đầu tiên ra khỏi một chuỗi.
    3. Bây giờ chúng ta có thể tạo biến $data cho kết quả chuỗi HTML, sẵn sàng trả về. Phương thức này có thể được lặp lại -- đầu tiên nếu $rule là một CSS class, tiếp đến nếu nó là một thẻ target. Đáng đề cập là chúng ta không cần lược bỏ ký tự đầu tiên cho thẻ target, khi html sử dụng dấu gạch chân (_), kg giống như các quy tắc cho CSS.

    Bây giờ chúng ta đã tạo ra các hàm cần thiết, chúng ta có thể trả về cho file index,php và chỉnh sửa phần gọi hàm anchor().

    1
    echo anchor('new-page.php','New Page','Custom Title Message!','#special_link');
    

    Ở đây chúng ta truyền vào tham số CSS ID, và chúng ta nhận được kết quả:

    1
    <a href="http://www.my-site-domain.com/new-page.php" title="Custom Title Message!" id="special_link">New Page</a>
    

    Nếu chúng ta thêm vào một mảng extras; trong trường hợp bạn muốn mở nó ra ở một cửa sổ mới và có một ID cụ thể và class (không chắc lắm nhưng đáng để thể hiện sự linh hoạt), chúng ta sẽ làm như thế này:

    1
    $extras = array('#special_id','.special_class','_blank');
    
    2
    echo anchor('new-page.php','New Page','Custom Title Message!',$extras);
    

    Ở đây, chúng ta thiết lập trước một biến số dạng mảng gọi là extras, chỉ để giữ cho mã lệnh gọn gàng, và sau đó đưa nó đến hàm anchor(). Nó sẽ xuất ra kết quả sau đây:

    1
    <a href="http://www.my-site-domain.com/new-page.php" title="Custom Title Message!" id="special_id" class="special_class" target="_blank">New Page</a>
    

    Các liên kết mailto

    Cuối cùng, chúng tôi cũng xem xét làm sao để tạo liên kết trong ứng dụng của bạn. Chúng tôi tạo một hàm gọi là mailto(), nó sẽ khá giống với hàm anchor(), với một khác biệt lớn: chúng ta sẽ khai triển một mã hoá trong kết quả html để các địa chỉ email không bị thu thập bởi các spam-spider và bảo đảm an toàn cho email của các khách hàng.

    Phương pháp mà chúng ta sẽ dùng để giấu các địa chỉ email sử dụng hàm str_rot13(), nó đơn giản lấy một chuỗi và chuyển tất cả các ký tự toàn chữ sang 13 ký tự kế tiếp. Trong chuỗi chữ. Nếu bạn từng đi trại hướng đạo sinh, có thể bạn sẽ nhớ những mật mã này, và quyết định xem bạn có dự định trở thành một gián điệp hay không khi bạn trưởng thành.

    Phần mã này sẽ xuất code của chúng ta theo phong cách bị cắt xén bớt, và sau đó, sử dụng một hàm JavaScript 'antidote' - giải mã, chúng ta có thể kéo các ký tự trở lại 13 vị trí của bảng chữ cái và lấy lại nghĩa gốc của nó. Tuy nhiên, khi hàm này ở phía người dùng, chỉ có các hoạt động giải mã, và chữ trả về chính nó, hiển thị trên màn hình. Do đó, spiders, crawlers và spambots, hầu như sẽ không hiểu chúng đang dò đọc cái gì.

    Có lẽ đáng để chú ý rằng có rất nhiều phương pháp để giấu đi liên kết mailto, một vài cái bảo mật phương pháp này, một số khác sẽ kém hơn. Tôi thích dùng cách này, và chưa từng thấy bất kỳ spam nào cho khách hàng của mình xảy ra do từ nó. Đáng chú ý là hàm JavaScript bản thân nó được phát triển bởi Christoph Burgdorfer, và nó trông thế này đây:

    1
    <script type="text/javascript">
    
    2
    document.write("Njrfbzr frperg fcl pbqr".replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));
    
    3
    </script>
    

    Nó sẽ lấy phần chuỗi bị cắt bỏ "Njrfbzr frperg fcl pbqr" và dời tất cả các ký tự khác, vì thế sẽ hiển thị trên màn hình bạn như sau:

    1
    Awesome secret spy code
    

    Tuy nhiên, nếu bạn xét lại phần mã nguồn, nó là cái mà các spider và crawler sẽ thấy, bạn sẽ thấy không có đề cập gì đến kết quả này -- do đó, nó sẽ tiếp tục được ẩn đi.

    Chúng ta sẽ không xem xét phần JavaScript làm việc ra sao, vì sau cùng đây vẫn là bài hướng dẫn PHP, Thay vào đó, chúng ta sẽ kiểm tra xem, làm thế nào chúng ta có thể triển khai nó trong các hàm mới mailto().

    1
    function mailto($email, $text, $title, $extras) //1
    
    
    2
    {	
    
    3
    	$link = '<a href=\"mailto:' . $email; //2
    
    
    4
    	$link = str_rot13($link); //3
    
    
    5
    	
    
    6
    	$data = '<script type="text/javascript">document.write("'; //4
    
    
    7
    	$data .= $link; //5
    
    
    8
    	$data .= '".replace(/[a-zA-Z]/g, function(c){return String.fromCharCode((c<="Z"?90:122)>=(c=c.charCodeAt(0)+13)?c:c-26);}));
    
    
    9
    </script>';
    
    10
    	$data .= '"';
    
    11
    	
    
    12
    	if ($title) //6
    
    
    13
    	{
    
    14
    		$data .= ' title="' . $title . '"';
    
    15
    	}
    
    16
    	else
    
    17
    	{
    
    18
    		$data .= ' title="' . $text . '"';
    
    19
    	}
    
    20
    	
    
    21
    	if (is_array($extras))
    
    22
    	{
    
    23
    		foreach($extras as $rule)
    
    24
    		{
    
    25
    			$data .= parse_extras($rule);
    
    26
    		}
    
    27
    	}
    
    28
    	
    
    29
    	if (is_string($extras))
    
    30
    	{
    
    31
    		$data .= parse_extras($extras);
    
    32
    	}
    
    33
    	$data .= ">";
    
    34
    	
    
    35
    	$data .= $text;
    
    36
    	$data .= "</a>"; //7
    
    
    37
    	return $data; //8
    
    
    38
    }
    

    Cho nên hãy xem xét để coi điều khác biết là gì ở đây.

    1. Đầu tiên, chúng tôi vẫn đưa 4 biến số cho hàm này, mặc dầu, cho mục đích làm đẹp, chúng tôi đặt tên lại biến số đầu tiên cho $email.
    2. Bây giờ, chúng tôi tạo ra một biến số mới với xuất bản HTML cho liên kết mailto. Đáng chú ý là chúng tôi đã thêm vào một dấu gạch chéo ngược trước dấu ngoặc kép khi chuỗi string xuất hiện bên trong hàm JavaScript, và chúng tôi cần phải chắc rằng các dấu ngoặc kép không gây nhầm lẫn cho chuỗi này.
    3. Kế tiếp, chúng tôi triển khai hàm str_rot13() trên biến số $link, vì thế nó được mã hoá.
    4. Chúng tôi có thể tạo ra biết số trả về $data, nó chứa sẵn mã JavaScript cho việc xuất kết quả.
    5. Chúng tôi đặt biến đã mã hoá $link vào giữa của tất cả - sẵn sàng để được chuyển đổi.
    6. Bây giờ mã JavaScript đã được bổ sung vào biến số $data, phần còn lại của hàm sẽ khá quen thuộc.
    7. Chúng tôi kiểm tra để xem nếu có một thẻ title được thêm vào, và sau đó chúng tôi phân tích biến số $extra. Một lần nữa, chúng tôi đóng thẻ lại.
    8. .. và trả về data.

    Giờ chúng ta có thể dùng cú pháp sau đây trong file index.php để xây dựng liên kết mailto:

    1
    echo mailto('secret@emailaddress.com','Contact Me');
    

    Hoặc, nếu chúng tôi cần các thành phần mới, giống như trước đó, chúng tôi có thể bổ sung thêm các biến:

    1
    $extras = array('#special_id','.special_class','_blank');
    
    2
    echo mailto('secret@emailaddress.com','Contact me','Contact your good pal Barry.',$extras);
    

    Tổng kết

    Điều này kết thúc đợt thâm nhập đầu tiên vào các hàm PHP Helper. Đây chỉ là phần nổi của tảng băng, và trong lần tiếp theo, chúng ta sẽ bắt đầu xem xét vài công cụ phức tạp hơn, trong các helper về biểu mẫu (form).

    Tạo ra và đánh giá các form phải là một trong những phần nhọc nhằn khi làm việc với chúng từ ban đầu - có rất nhiều code lặp lại, cần cù viết ra, và có cơ hội bị mắc lỗi. Một chuỗi các hàm xuất các form có cấu trúc đúng đắn và kiểm tra dữ liệu post cho email hợp lệ, mật khẩu, độ dài À vâng, tạo các form HTML từ đầu không cần quá khắc nghiệt như bạn đã nghĩ trước đó.

    Nếu bạn có những ý kiến nào khác có thể hữu dụng để thành một hàm PHP Helper, hãy bình luận về nó nào!

Advertisement
Did you find this post useful?
Want a weekly email summary?
Subscribe below and we’ll send you a weekly email summary of all new Code tutorials. Never miss out on learning about the next big thing.
Advertisement
Looking for something to help kick start your next project?
Envato Market has a range of items for sale to help get you started.