Kỹ năng viết mã PHP

Tủ sách mở Wikibooks

Bước tới: chuyển hướng, tìm kiếm

Tổng hợp về các phong cách viết mã PHP (tiếng Anh A brief on PHP Coding Styles) là một tập hợp các quy tắc mà người lập trình PHP, một khi đã lựa chọn nó, nên tuân thủ trong quá trình tạo ra chương trình nhằm mục đích tạo sự thống nhất chung giữa các đoạn mã dễ theo dõi, sử dụng lại, phát hiện lỗi, bảo trì và kế thừa chương trình. Việc tuân thủ quy ước này sẽ giúp duy trì được khả năng làm việc nhóm và khả năng kế thừa lại của người đi sau.

Tài liệu này nên được đọc và hiểu như là một tham khảo về các phong cách viết mã PHP đương đại để có thể tùy nghi lựa chọn, nghiên cứu thêm. Nó không phải là một hướng dẫn kĩ thuật để lập trình được với PHP.

Cách viết mã PHP này dùng các nguồn tham khảo chủ yếu đến từ PEAR, Chuẩn viết mã Java theo Sun và một số trang khác. Kỹ thuật này hướng dẫn phong cách lập trình PHP có thể được dùng để tham khảo trong quá trình viết mã PHP.

Mục lục

[ẩn]

[sửa] Giới thiệu

Trang này cần được wiki hóa. Xin hãy trình bày trang theo các hướng dẫn đề cập trong phần Cẩm nang về văn phong, rồi bỏ chú thích này đi.

[sửa] Tại sao cần có quy ước viết mã

Các quy ước viết mã có ý nghĩa quan trọng đối với các lập trình viên vì một số lý do:

  • 80% trong tổng số chi phí duy trì một gói phần mềm phát sinh trong giai đoạn bảo trì.
  • Hầu như không có bất cứ một phần mềm nào được bảo trì trong suốt cả thời gian tồn tại của nó bằng chính tác giả đầu tiên của nó.
  • Các quy ước viết mã nâng cao tính dễ theo dõi của phần mềm, cho phép các kĩ sư hiểu được các dòng mã mới nhanh hơn và sâu sắc hơn.
  • Một mã nguồn được đưa ra thị trường như là một sản phẩm cần phải được đảm bảo là nó được đóng góp chuẩn và gọn ghẽ như bất cứ sản phẩm nào khác.

Để các quy ước này có hiệu lực, tất cả những ai tham gia viết phần mềm đều phải tuân thủ theo các quy ước viết mã. Không trừ một ai.

[sửa] Kế thừa và đóng góp

Tài liệu này phản ánh các tiêu chuẩn viết mã trong ngôn ngữ lập trình PHP được tổng hợp từ các tài liệu về Quy ước viết mã trong PEAR, Java do Sun Microsystems và đội ngũ PHP cung cấp.

[sửa] Tên file

[sửa] Phần mở rộng của tập tin

Luôn đặt phần mở rộng của tập tin là .php. Việc đặt đuôi khác như .inc hay .class đôi khi sẽ gặp rắc rối và tập tin PHP sẽ không được thực thi.

[sửa] Cách đặt tên file

[sửa] Các tên file thường gặp trong các ứng dụng PHP

Phần này nói về các tên tập tin thường gặp và tại sao nên dùng cái nào và không nên dùng cái nào. Ví dụ: để cấu hình trong tập tin dạng .ini là không nên nếu chưa có kinh nghiệm về .htaccess. Ngoài ra còn .lng, .xsl, .xml, .tpl. Các tập tin khác như gpl.txt, README.txt

[sửa] Cách đặt tên file chứa lớp

Theo quy ước đặt tên của Mojavi framework, tất cả các tập tin chứa các lớp (bao gồm cả các thư viện của framework) đều có hậu tố là .class.php

Ví dụ: Action.class.php

[sửa] Cách tổ chức file

[sửa] Bố cục nội dung trong file

[sửa] Dữ liệu miêu tả đầu file và lớp

Tất cả các file mã nguồn nên có một khối dữ liệu miêu tả ở cấp trang ở ngày đầu file và một khối dữ liệu miêu tả ở cấp lớp nằm ngày trên phần mã cho mỗi lớp. Phần này nên viết bằng tiếng Anh. Ví dụ:

 <?php
 /* vim: set expandtab tabstop=4 shiftwidth=4 softtabstop=4: */
 /**
  * Short description for file
  *
  * Long description for file (if any)...
  *
  * PHP versions 4 and 5
  *
  * LICENSE: This source file is subject to version 3.0 of the PHP license
  * that is available through the world-wide-web at the following URI:
  * http://www.php.net/license/3_0.txt.  If you did not receive a copy of
  * the PHP License and are unable to obtain it through the web, please
  * send a note to license@php.net so we can mail you a copy immediately.
  *
  * @category   CategoryName
  * @package    PackageName
  * @author     Original Author <author@example.com>
  * @author     Another Author <another@example.com>
  * @copyright  1997-2004 The PHP Group
  * @license    http://www.php.net/license/3_0.txt  PHP License
  * @version    CVS: $Id:$
  * @link       http://pear.php.net/package/PackageName
  * @see        NetOther, Net_Sample::Net_Sample()
  * @since      File available since Release 1.2.0
  * @deprecated File deprecated in Release 2.0.0
  */
  // Place includes, constant defines and $_GLOBAL settings here.
/** * Short description for class * * Long description for class (if any)... * * @author Original Author <author@example.com> * @author Another Author <another@example.com> * @copyright 1997-2004 The PHP Group * @license http://www.php.net/license/3_0.txt PHP License * @version Release: @package_version@ * @link http://pear.php.net/package/PackageName * @see NetOther, Net_Sample::Net_Sample() * @since Class available since Release 1.2.0 * @deprecated Class deprecated in Release 2.0.0 */ class foo { } ?>

Tham khảo PEAR: http://pear.php.net/pepr/pepr-proposal-show.php?id=128 (Còn tiếp)

[sửa] Thẻ đánh dấu mã PHP

Phần này nói rõ là nên dùng <?php?> chứ không dùng cái khác. Với cách dùng này, tập tin PHP sẽ luôn được hiểu một cách chính xác.

[sửa] Cách thụt lùi dòng và chiều dài của dòng

Phần này nói về số white space áp dụng cho các hàng thụt lùi: ví dụ cho hàm con thuộc lớp, lệnh if trong một hàm thì lùi vào so với số cột bắt đầu tên hàm là bao nhiêu….

[sửa] Chú thích mã

Nên chú thích mã như thế nào. Áp dụng các thẻ meta (param) như thế nào. Áp dụng /**/ cùng với // như thế nào.

[sửa] Định dạng file

Phần này tuân thủ nguyên tắc của PEAR (có sửa đổi) theo đó:

  • Định dạng file là dạng văn bản ASCII (nên xem lại điểm này vì tiếng Việt có thẻ chứa Unicode mà)
  • Sử dụng mã hóa kí tự UTF-8
  • Được định dạng cho Unix
    • "Định dạng theo Unix" nghĩa là:
      1. Các dòng phải được kết thúc chỉ với một kí hiệu line feed (LF). Các kí hiệu bắt đầu hàng mới như vậy được được biểu diễn như là các kí hiệu hệ thập phân (10), hệ bát phân (012) và hệ thập lục phân (0A) thông thường. Không dùng các kí hiệu về đầu hàng carriage returns (CR) như các máy Macintosh hay kết hợp carriage return/line feed (CR/LF) như các máy Windows.
      2. Nên có một line feed sau thẻ PHP đóng (?>). Điều đó có nghĩa là khi con trỏ ở tận cùng của file, thì nó nên có một hàng bên dưới thẻ PHP đóng.

[sửa] Quy ước đặt tên biến, hằng, hàm, phương thức, lớp

[sửa] Khai báo

[sửa] Khai báo và khởi tạo biến

[sửa] Biến toàn cục

Nếu một gói cần định nghĩa các biến toàn cục (global) thì tên của chúng nên bắt đầu bằng một gạch đơn dưới, sau đó là tên gói và một gạch dưới khác. Ví dụ, gói PEAR dùng một biến toàn cục là $_PEAR_destructor_object_list.

[sửa] Biến thông thường

Tên biến nên là danh từ có ý nghĩa miêu tả nó chứa cái gì hay nó làm nhiệm vụ gì. Tên biến nên bắt đầu bằng chữ viết thường. Nếu biến gồm có nhiều từ thì ghép các từ đó lại: từ đầu tiên viết thường, từ thứ hai và thứ ba viết hoa chữ cái đầu tiên. Ví dụ:

  • somePrivateProperty
  • counter

Các cái tên như "foo" và "tmp" nên tránh dùng vì nó không miêu tả cái gì cả. Tên biến không nên chứa các con số. Các con số nên được miêu tả bằng các chữ cái trừ khi có lý do thiết thực để không làm như vậy. (Theo Chuẩn của ezPublish).

Ví dụ:

  • $valueOne

[sửa] Tên lớp, khai báo lớp và giao diện

Tên lớp nên là một danh từ miêu tả, xác định rõ lớp đó nó là cái gì. Tránh dùng từ viết tắt. Tên lớp nên bắt đầu bằng từ viết hoa. Khi áp dụng kĩ thuật hướng đối tượng để viết mã thì cần chú ý tên lớp cũng nên phản ảnh cây phân cấp lớp, mỗi bậc của cây phân cấp được cách nhau thông qua một dấu gạch dưới. Ví dụ:

  • Log
  • Net_Finger
  • HTML_Upload_Error

[sửa] Định nghĩa hàm và gọi hàm

[sửa] Tên gọi của hàm

Trong PHP, khái niệm hàm và phương thức thay thế được cho nhau. Chúng ta gọi khái niệm hàm cho lập trình thủ tục và dùng khái niệm phương thức khi lập trình hướng đối tượng.

Hàm và phương thức đều chỉ mặt hoạt động, thao tác, vì vậy tên chúng nên gọi tả hành động tương ứng.

Hàm và phương thức nên được đặt tên theo quy tắc "studly caps" (còn được gọi là "bumpy case" hay "camel caps"). Hàm nên lấy tên gói làm tiền tố, để tránh xung độ giữa các gói. Phần tiền tố cách phần tên hàm thực thụ qua một dấu gạch dưới. Chữ cái đầu tiên của tên (sau tiền tố) nên viết thường, và mỗi một chữ bắt đầu một từ mới sẽ viết hoa. Ví dụ:

Các thành viên lớp dạng private (nghĩa là thành viên đó được tạo ra chỉ nhằm để tiếp xúc với bên trong lớp mà chúng được khai báo mà thôi) thì được bắt đầu bằng một dấu gạch dưới. Ví dụ:

  • _sort()
  • _initTree()
  • $this->_status

Cách khai báo này được dùng trong PHP 4.x khi các từ khóa sửa đổi phạm vi truy cập chưa được định nghĩa. Nhưng ở PHP5, PEAR không còn khuyến cáo cách làm này nữa do PHP 5 đã định nghĩa 3 phạm vi truy cập là private, public, protected.

[sửa] Định nghĩa hàm

Phần định nghĩa hàm nên tuân thủ theo quy ước "một ngoặc đơn thực sự". Không nên dùng dấu cách giữa tên hàm là dấu ngoặc đơn mở. Dấu ngoặc nhọn xác định phạm vi của hàm được đặt trên các dòng riêng.

 <?php
 function fooFunction($arg1, $arg2 = )
 {
     if (condition) {
         statement;
     }
     return $val;
 }
 ?>

Các đối số có giá trị mặc định được đặt ở cuối danh sách đối số. Cố gắng trả lại một giá trị có nghĩa từ một hàm, nếu có giá trị thích hợp. Ví dụ:

 <?php
 function connect(&$dsn, $persistent = false)
 {
     if (is_array($dsn)) {
         $dsninfo = &$dsn;
     } else {
         $dsninfo = DB::parseDSN($dsn);
     }
if (!$dsninfo || !$dsninfo['phptype']) { return $this->raiseError(); }
return true; } ?>

[sửa] Lời gọi hàm, phương thức

Khi gọi hàm, không nên dùng dấu cách giữa tên hàm, ngoặc đơn mở, và tham số thứ nhất; nên dùng một dấu cách giữa dấu phẩy và tham số, và không dùng dấu cách giữa tham số cuối cùng, dấu ngoặc đơn đóng và dấu chấm phẩy. Ví dụ:

 <?php
 $var = getMessage($bar, $baz, $quux);
 ?>

Như thấy ở trên, nên để một dấu cách ở hai bên dấu bằng dùng đến gán giá trị trả lại của một hàm vào một biến. Trong trường hợp viết nhiều phép gán có liên quan thì có thể dùng thêm nhiều dấu cách để làm tăng thêm tính dễ đọc:

 <?php
 $short         = foo($bar);
 $longVariable  = foo($baz);
 ?>

Lời gọi phương thức tuân theo những quy tắc cũng tương tự như lời gọi hàm. Phương thức là thuật ngữ dùng để chỉ hàm khai báo bên trong các lớp. Chuẩn này khuyến cáo không dùng dấu cách để tách phần dấu ngoặc đơn với đối số đặt ở giữa cặp ngoặc đơn này. Sau đây là ví dụ để bạn phân biệt cách gọi nào là hợp chuẩn:

 // Khuyến cáo theo Chuẩn này
 $object->method($a);
 $array[10] = 'foo';

 // Không khuyến cáo
 $object->method($a);
 $array[ 10 ] = 'foo';

[sửa] Khai báo hằng

Các hằng nên luôn viết tất cả dưới dạng chữ hoa, dùng gạch dưới để tách các từ. Phần tên hằng làm tiền tố thì dùng tên chữ hoa của lớp hoặc gói mà chúng ta định dùng chúng trong đó. Ví dụ, các hằng dùng trong gói DB:: tất cả đều bắt đầu bằng DB_. Điều này cũng là để tránh xung đột thôi.

Xin chú ý: Các hằng true, false và null là những trường hợp đặc biệt không bị chi phối bởi quy ước viết hoa này cho nên luôn viết chúng ra dưới dạng chữ thường.

[sửa] Câu lệnh

[sửa] Câu lệnh đơn giản

<?php echo "Welcome to http://www. http://www.vnrockworld.net"; ?>

<?php $text= " http://www.vnrockworld.net"; echo "mytext is" .$text; ?>

<?php // http://www.vnrockworld.net $i=4; $z=5; if ($i>$z) echo "True; else cho "Flase"; ?>

[sửa] Lệnh tổ hợp

[sửa] Lênh return

[sửa] Lệnh điều kiện và cấu trúc điều khiển

Cấu trúc điều khiển trong PHP bao gồm có if, for, while, switch, foreach.

Các cấu trúc điều khiển nên dùng một khoảng trống giữa từ khóa điều khiển và ngoặc đơn mở, để phân biệt chúng với lời gọi hàm.

Nên dùng các ngoặc nhọn ngay cả trong các tình huống chúng chỉ được xem là các tùy chọn kĩ thuật. Các dấu ngoặc nhọn sẽ làm cho mã dễ đọc hơn và làm giảm khả năng xảy ra các lỗi logic khi viết thêm các dòng mã mới.

[sửa] Lệnh if/else

Dưới đây là cách dùng hàm if/else tuân thủ quy ước chung

 <?php
 if ((condition1) || (condition2)) {
     action1;
 } elseif ((condition3) && (condition4)) {
     action2;
 } else {
     defaultaction;
 }
 ?>

[sửa] Lệnh for

Cách dùng vòng lặp for rất đơn giản:

 <?php
 
for ( expression1; condition; expression2 )
  { 
    expresion3;
  }
 ?>

[sửa] Lệnh while

Lệnh while cho phép thực thi một đoạn mã nếu như một điều kiện nào đó được thoả mãn, và chỉ ngừng chạy khi điều kiện đó không còn đúng.

Cú pháp cho vòng lặp while:

while (condition) code to be executed;

Ví dụ:

 <?php
    $i=1;
    while($i<=5)
    {
       echo "The number is " . $i . "<br />";
       $i++;
    }
 ?>

Giải thích ví dụ:

Vòng lặp while trên sẽ được thực thi lặp đi lặp lại với mỗi giá trị biếng $i thoả mãn điều kiện (nằm trong khoảng từ 1 đén 5). Giá trị khởi đầu của biến $i là 1. Sau mỗi lần thực hiện xong đoạn mã, giá trị này tăng thêm 1 (+1) rồi tiếp tục lặp lại đoạn mã đến khi nào đạt giá trị > 5 thì dừng.

Như vậy, kết quả của đoạn mã trên sẽ như sau:

 The number is 1 
 The number is 2 
 The number is 3 
 The number is 4 
 The number is 5 

[sửa] Lệnh dowhile

Lệnh Do…while có chức năng tương tự while. Nhưng trong khi while thực thi đoạn mã khi và chỉ khi điều kiện nêu ra được thoả mãn thì Do…while sẽ thực thi đoạn mã ít nhất 1 lần – ngay cả khi điều kiện không đúng – và tiếp tục lặp lại đoạn mã nếu như điều kiện vẫn còn đúng.

Cú pháp của vòng lặp Do…while:

 do
 {
   code to be executed;
 }
   while (condition);

Ví dụ:

 <?php 
 $i=0;
 do
 {
   $i++;
   echo "The number is " . $i . "<br />";
 }
 while ($i<5);
 ?>

[sửa] Lệnh switch
 <?php
 switch (condition) {
 case 1:
     action1;
     break;
  
 case 2:
     action2;
     break;
  
 default:
     defaultaction;
     break;
 }
 ?>

[sửa] Lệnh trycatch

[sửa] Liên kết ngoài

Gửi phản hồi

Please log in using one of these methods to post your comment:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s

%d bloggers like this: