Hướng dẫn dùng define increments trong PHP

Đáng lẽ ra bài này tôi trình bày ở bài tạo khóa chính Primary Key nhưng thiết nghĩ để các bạn dễ tìm kiếm thì tôi sẽ chia nhỏ nó ra làm một bài riêng để trình bày cho chi tiết hơn. AUTO_INCREMENT là một chức năng khá quan trọng trong việc phân tích và tối ưu cơ sở dữ liệu, chi tiết thì bạn đọc ở phần dưới đây.

Hướng dẫn dùng define increments trong PHP

Hướng dẫn dùng define increments trong PHP

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

1. AUTO_INCREMENT là gì?

AUTO_INCREMENT nói nôm na có nghĩa là tăng tự động, có nghĩa là nếu bạn thiết lập một field nào đó là tăng tự động thì khi bạn thêm record mới bạn không cần phải truyền data cho nó và nó sẽ tự lấy giá trị lớn nhất tăng lên 1. Tuy nhiên không phải lúc nào nó cũng lấy giá trị lớn nhất mà sẽ tuân theo những tính chất sau đây:

  • AUTO_INCREMENT chỉ thiết lập được cho kiểu INT và mỗi bảng chỉ có một field duy nhất, nghĩa là nếu bạn thiết lập 2 fields là AUTO_INCREMENT thì sẽ bị lỗi ngay.
  • Khi bạn thêm dữ liệu nếu bạn có truyền data thì nó sẽ lấy data đó thay vì tăng tự động, ngược lại nó sẽ lấy giá trị lớn nhất hiện tại và tăng lên 1(giá trị lớn nhất này lưu trong config của table chứ không phải là id lớn nhất trong các records).
  • Khi bạn xóa một record thì sẽ bị khuyết mất một giá trị, lúc này nếu bạn thêm thì nó sẽ không lấp vào vị trí này mà nó tuân theo quy luật trên.
  • Giả sử giá trị 120 là lớn nhất, bạn xóa đi 120 thì lúc này lớn nhất là 119. Lúc này nếu ban thêm mới thì nó sẽ lấy 121 chứ không phải là 120 vì giá trị lớn nhất nó lưu trong config của table.
  • Thông thường ta sử dụng AUTO_INCREMENT cho Primary Key khi viết ứng dụng website
  • Mặc định AUTO_INCREMENT sẽ có giá trị đầu tiên là 1

Đấy là những đặc điểm của AUTO_INCREMENT. Bây giờ ta sẽ tìm hiểu các thiết lập nó nhé.

2. Tạo AUTO_INCREMENT

Để tạo AUTO_INCREMENT thì ta thêm từ khóa AUTO_INCREMENT đằng sau field muốn tạo trong lệnh tạo bảng (Create Table). Thông thường chúng ta dùng cho khóa chính nên trong các ví dụ dưới đây tôi sử dụng cho field

ALTER TABLE Users AUTO_INCREMENT = 1000
1.

Bài viết này được đăng tại [free tuts .net]

CREATE TABLE Users(
	id INT(11) NOT NULL PRIMARY KEY AUTO_INCREMENT,
	username VARCHAR(50) NOT NULL UNIQUE,
	email VARCHAR (50) NOT NULL UNIQUE
)

3. Thay đổi giá trị AUTO_INCREMENT

Như bạn biết mặc định AUTO_INCREMENT sẽ có giá trị đầu tiên là 1. Nhưng đôi lúc bạn muốn giá trị đầu tiên của nó là một con số khác thì bạn sẽ sử dụng lênh

ALTER TABLE Users AUTO_INCREMENT = 1000
3 để thay đổi.

ALTER TABLE Users AUTO_INCREMENT = 1000

Sau khi chạy lệnh này thì khi bạn thêm dữ liệu nó sẽ lấy 1000 thay vì 1 như cấu hình mặc định ban đầu.

Lưu ý: Nếu số bạn chọn nhỏ hơn số max của auto thì sẽ không có tác dụng. Ví dụ field ID hiện tại max là 1000 nhưng bạn thay đổi thông số auto 400 thì sẽ không có tác dụng.

4. Lời kết

Khi phân tích dữ liệu bạn nên chọn khóa chính là auto increment, thứ nhất là nó truy vấn nhanh và thứ hai là khi thêm dữ liệu bạn không cần phải truyền giá trị cho khóa chính vì nó đã tăng tự động. Bài này kết thúc tại đây, bài tiếp theo mình sẽ nói về khóa ngoại (foreign key).

// Using short array syntax.
// Also, works with array() syntax.
$arr1 = [1, 2, 3];
$arr2 = [...$arr1]; //[1, 2, 3]
$arr3 = [0, ...$arr1]; //[0, 1, 2, 3]
$arr4 = [...$arr1, ...$arr2, 111]; //[1, 2, 3, 1, 2, 3, 111]
$arr5 = [...$arr1, ...$arr1]; //[1, 2, 3, 1, 2, 3]

function getArr() {
  return ['a', 'b'];
}
$arr6 = [...getArr(), 'c' => 'd']; //['a', 'b', 'c' => 'd']
?>

Tips: Hiện nay, có rất nhiều version PHP khác nhau. Nhưng tôi khuyên bạn nên sử dụng PHP version 5.6 trở lên, để bạn có thể dễ dàng folow theo những bài viết này.

PHP Functions

PHP có hàng trăm các functions được tích hợp sẵn, làm nó trở thành một ngôn ngữ rất tiện ích và phong phú. Để sử dụng function, hãy gọi nó ra thông qua tên. Ví dụ, bạn có thể xem function date dưới đây:

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
0
Dấu ngoặc đơn ở trên sẽ nói cho PHP biết rằng, bạn đang tham chiếu tới một function. Nếu không có, PHP sẽ nghĩ rằng bạn đang tham chiếu tới một contant. Một function có thể không nhận vào bất kỳ argument nào. Ví dụ, function
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
1 dưới đây hiển thị rất nhiều thông tin về cài đặt của PHP hiện tại, nhưng không yêu cầu argument.
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
2
Hướng dẫn dùng define increments trong PHP

Dung @do.dinh.dung

Theo dõi

128 8 24

Đã đăng vào thg 9 17, 2021 3:33 CH 17 phút đọc

374

0

0

[PHP] PHP Functions & Objects (Phần 1)

  • Báo cáo
  • Thêm vào series của tôi

Có một số yêu cầu cơ bản đối với các ngôn ngữ lập trình như là: Cần một nơi để lưu trữ data, quản lý flow program, đánh giá biểu thức, quản lý file, và text output ... Vv. Và PHP có đáp ứng được tất cả những thứ này, cộng thêm nó có support các câu lệnh như

$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
4 hay
$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
5 giúp ta điều khiển program một cách dễ dàng. Tuy nhiên, ngay cả khi ta dùng những thứ này thì việc lập trình vẫn sẽ trở nên khá tốn công và buồn chán, đặc biệt khi bạn phải viết lại các đoạn code giống nhau mỗi khi cần dùng chúng.
Đó là lý do, người ta tạo ra các khái niệm về functions và objects. Và có thể bạn đã biết, thì
$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
6 là một tập hợp các câu lệnh thực hiện một chức năng cụ thể, và return về một value tùy ý. Bạn có thể đặt một đoạn code - cần sử dụng nhiều lần vào trong một function và gọi function đó theo tên khi cần dùng tới nó.
Functions có rất nhiều ưu điểm so với inline code. Ví dụ như:

  • Gõ ít code hơn
  • Giảm lỗi liên quan tới cú syntax và các lỗi lập trình khác
  • Giảm thời gian load của program files
  • Giảm thời gian thực thi, vì mỗi function chỉ biên dịch một lần, bất kể bạn gọi hàm đó nhiều như thế nào
  • Có thể truyền vào function các arguments, cho nên ta có thể tái sử dụng trong nhiều trường hợp khác nhau

Ngoài ra, một

$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
7 kết hợp với một hay nhiều funtion, và dữ liệu chúng sử dụng trong một cấu trúc duy nhất gọi là một
$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
8.
Trong loạt bài viết này, ta sẽ tìm hiểu về cách sử dụng function, từ việc define nó, đến việc gọi nó ra để truyền các đối số. Với các kiến thức này, ta có thể bắt đầu tạo các function và sử dụng nó cho các object của chúng ta. (ta gọi đây là các
$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;
9.)

Tips: Hiện nay, có rất nhiều version PHP khác nhau. Nhưng tôi khuyên bạn nên sử dụng PHP version 5.6 trở lên, để bạn có thể dễ dàng folow theo những bài viết này.

PHP Functions

PHP có hàng trăm các functions được tích hợp sẵn, làm nó trở thành một ngôn ngữ rất tiện ích và phong phú. Để sử dụng function, hãy gọi nó ra thông qua tên. Ví dụ, bạn có thể xem function date dưới đây:

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
0
Dấu ngoặc đơn ở trên sẽ nói cho PHP biết rằng, bạn đang tham chiếu tới một function. Nếu không có, PHP sẽ nghĩ rằng bạn đang tham chiếu tới một contant. Một function có thể không nhận vào bất kỳ argument nào. Ví dụ, function
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
1 dưới đây hiển thị rất nhiều thông tin về cài đặt của PHP hiện tại, nhưng không yêu cầu argument.
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
2

Tips: function

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
1 cực kỳ hữu ích để ta biết được thông tin về các cài đặt PHP hiện tại, nhưng nó cũng có thể rất hữu ích đối với các hacker. Do đó, đừng bao giờ để lại đoạn function này trong các đoạn code của bạn.

Ta có thể tiếp tục xem một số function tích hợp sẵn, yêu cầu một hay nhiều argument đầu vào như dưới đây:


  echo strrev(" .dlrow olleH"); // Reverse string
  echo str_repeat("Hip ", 2);   // Repeat string
  echo strtoupper("hooray!");   // String to upper case
?>

Ví dụ trên đã sử dụng 3 string function để ouput ra đoạn text dưới đây:

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
4
Ta thấy rằng, funtion
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
5 sẽ đảo ngược thứ tự các ký tự trong string, function str_repeat sẽ lặp lại string
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
6 2 lần (theo yêu cầu của argument thứ 2). Và function
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
7 sẽ chuyển đổi
$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
8 thành chữ viết hoa.

Defining a Function

Cú pháp chung cho việc define một function như sau:

function function_name([parameter [, ...]]) 
{
 // Statements 
}

Ý nghĩa của dòng đầu tiên như sau:

  • Define một function sẽ bắt đầu bằng từ khóa
    $lowered = strtolower("aNY # of Letters and Punctuation you WANT");
    echo $lowered;
    
    6
  • Tên hàm theo sau phải bắt đầu bằng một chữ cái hoặc dấu gạch dưới, và theo sau đó là chữ cái, số, hoặc dấu gạch dưới.
  • Bắt buộc phải có dấu ngoặc đơn đi kèm
  • Các tham số của hàm được phân tách bằng dấu phẩy

Ngoài ra, tên function sẽ không phân biệt chữ hoa - thường, vì vậy tất cả các string sau đều tham chiếu tới


  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
0 function:

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
1.
Các câu lệnh của function sẽ được viết trong cặp dấu ngoặc nhọn mở - đóng, các cấu lệnh này có thể bao gồm một hay nhiều lệnh

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
2, lệnh

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
2 sẽ ép buộc dừng thực thi và thực hiện trả về giá trị yêu cầu.

Returning a Value

Ta cùng nhau xem một function đơn giản dưới đây giúp convert fullname của peron thành lowercase và thực hiện viết hoa chữ cái đầu tiên.
Ở phần trên, ta đã làm quen với function

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;
7 được tích hợp sẵn của PHP. Sau đây ta sẽ sử dụng một function tương tự đó là

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
5:

$lowered = strtolower("aNY # of Letters and Punctuation you WANT");
echo $lowered;

Ta có output như sau:


  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
6
Tuy nhiên, tôi không muốn tất cả các ký tự đều là chữ thường, tôi muốn viết hoa chữ cái đầu tiên. May mắn là trong PHP cũng có cung cấp một function tên là

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
7 giúp chuyển đổi ký tự đầu tiên string thành chữ in hoa:

$ucfixed = ucfirst("any # of letters and punctuation you want");
echo $ucfixed;

Ta có output như sau:


  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
8
Giờ ta có thể thực hiện thiết kế một program đơn giản đầu tiên: đó là, để có được một từ viết hoa chữ cái đầu tiên, ta sẽ gọi

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
5 trước, sau đó tiếp tục gọi

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
7. Cách để thực hiện điều này đó là ta lồng function

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
5 trong

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
7. Điều quan trọng là ta phải chú ý đến thứ tự thực thi của biểu thức.
Trước hết, ta thử thực hiện gọi tới function như sau:

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names($a1, $a2, $a3); echo $a1 . " " . $a2 . " " . $a3; function fix_names(&$n1, &$n2, &$n3) { $n1 = ucfirst(strtolower($n1)); $n2 = ucfirst(strtolower($n2)); $n3 = ucfirst(strtolower($n3)); } ?>
3
Ở trên, biểu thức 5 - 8 sẽ được thực thi trước, và ta có ouput là -3. (Ở đây, PHP sẽ convert kết quả thành một string và hiển thị nó ra màn hình). Và nếu biểu thức này bao gồm một function khác bên trong, thì function này sẽ được thực thi trước:

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names($a1, $a2, $a3); echo $a1 . " " . $a2 . " " . $a3; function fix_names(&$n1, &$n2, &$n3) { $n1 = ucfirst(strtolower($n1)); $n2 = ucfirst(strtolower($n2)); $n3 = ucfirst(strtolower($n3)); } ?>
4
Trong biểu thức trên, PHP đã thực hiện một số việc theo trình tự như sau:

  • Thực hiện phép tính 5 - 8 để trả về giá trị là -3
  • Dùng function
    
      $a1 = "WILLIAM";
      $a2 = "henry";
      $a3 = "gatES";
    
      echo $a1 . " " . $a2 . " " . $a3 . "
    "
    ; fix_names($a1, $a2, $a3); echo $a1 . " " . $a2 . " " . $a3; function fix_names(&$n1, &$n2, &$n3) { $n1 = ucfirst(strtolower($n1)); $n2 = ucfirst(strtolower($n2)); $n3 = ucfirst(strtolower($n3)); } ?>
    5 để biến đổi - 3 thành 3
  • Convert kết quả thành string và ouput ra bằng function
    
      echo fix_names("WILLIAM", "henry", "gatES");
    
      function fix_names($n1, $n2, $n3)
      {
        $n1 = ucfirst(strtolower($n1));
        $n2 = ucfirst(strtolower($n2));
        $n3 = ucfirst(strtolower($n3));
    
        return $n1 . " " . $n2 . " " . $n3;
      }
    ?>
    
    0

Tóm lại, PHP đã thực thi biểu thức từ trong ra ngoài. Và biểu thức dưới đây cũng hoạt động theo trình tự tương tự:


  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names($a1, $a2, $a3); echo $a1 . " " . $a2 . " " . $a3; function fix_names(&$n1, &$n2, &$n3) { $n1 = ucfirst(strtolower($n1)); $n2 = ucfirst(strtolower($n2)); $n3 = ucfirst(strtolower($n3)); } ?>
7
Ở đây, PHP sẽ gọi tới

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
5 trước, sau đó gọi tới

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
7 function, ta được output như sau:

  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>
8
Ở ví dụ tiếp theo dưới đây, ta sẽ define một function có 3 đối số names, mỗi name là chữ thường có ký tự đầu tiên viết hoa.


  echo fix_names("WILLIAM", "henry", "gatES");

  function fix_names($n1, $n2, $n3)
  {
    $n1 = ucfirst(strtolower($n1));
    $n2 = ucfirst(strtolower($n2));
    $n3 = ucfirst(strtolower($n3));

    return $n1 . " " . $n2 . " " . $n3;
  }
?>

Ta thu được output như sau:

WILLIAM henry gatES
William Henry Gates
1

Returning an Array

Trước version PHP 5.3, ta có thể mở đầu một biến bằng ký tự

WILLIAM henry gatES
William Henry Gates
2 tại thời điểm gọi funcion (ví dụ,
WILLIAM henry gatES
William Henry Gates
3) để yêu cầu trình phân tích truyền một tham chiếu tới biến, chứ không phải giá trị của biến. Điều này đã cho phép một function truy cập vào biến (cho phép các giá trị khác nhau được ghi ngược lại vào nó)

Tips: Kiểu truyền tham chiếu theo thời gian gọi này đã không được dùng trong PHP 5.3 và được xóa bỏ hoàn toàn ở PHP 5.4. Do đó, bạn không nên dùng tính năng này ngoại trừ những trang web cũ. Lời khuyên là, bạn nên viết lại code mà đã dùng theo kiểu truyền tham chiếu này, bởi vì nó sẽ gặp phải lỗi cực kỳ nghiêm trọng ở các phiên bản PHP mới hơn.

Tuy nhiên, trong chỗ định nghĩa function, bạn vẫn có thể tiếp tục truy cập các đối số thông qua tham chiếu. Khái niệm này có thể hơi khó hiểu chút, do đó ta sẽ cùng quay lại với ví dụ về hộp diêm ở các bài viết trước.
Hãy tưởng tượng rằng, thay vì lấy một mảnh giấy ra khỏi hộp diêm, đọc nó, copy những gì trong nó sang một mảnh giấy khác, đặt bản gốc quay trở lại hộp, và truyền bản copy đó tới một function. Thì ta có một cách đơn giản hơn đó là đính kèm một sợi chỉ vào mảnh giấy ban đầu, và truyền đầu còn lại tới functoin. Sau đó thì function có thể theo dõi luồng này để tìm dữ liệu được truy cập. Điều này sẽ tránh được quá tải việc tạo ra các bản copy của biến chỉ cho function sử dụng. Hơn nữa, function này giờ có thể chỉnh sửa trực tiếp giá trị của biến.
Sau đây ta sẽ viết lại ví dụ về function

WILLIAM henry gatES
William Henry Gates
4 bên trên để truyền các tham chiếu cho tất cả các tham số, và sau đó function có thể chỉnh sửa trực tiếp các tham số này.


  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names($a1, $a2, $a3); echo $a1 . " " . $a2 . " " . $a3; function fix_names(&$n1, &$n2, &$n3) { $n1 = ucfirst(strtolower($n1)); $n2 = ucfirst(strtolower($n2)); $n3 = ucfirst(strtolower($n3)); } ?>

Thay vì truyền trực tiếp các string vào function, đầu tiên ta sẽ gán nó tới các biến, và in nó ra để xem giá trị đầu tiên của nó trước đã. Sau đó, ta gọi tới function như bình thường, có điều đặc biệt là ở chỗ định nghĩa function ta sẽ đặt thêm ký tự

WILLIAM henry gatES
William Henry Gates
2 ở trước mỗi tham số mà sẽ thực hiện truyền tham chiếu.
Giờ đây, thì các biến
WILLIAM henry gatES
William Henry Gates
6,
WILLIAM henry gatES
William Henry Gates
7, và
WILLIAM henry gatES
William Henry Gates
8 sẽ được gắn vào "threads" nối tới các giá trị của
WILLIAM henry gatES
William Henry Gates
9,

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
0, và

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
1. Nói cách khác, đây là một nhóm các giá trị, nhưng có 2 tập tên biến được phép truy cập vào chúng. Dó đó, function
WILLIAM henry gatES
William Henry Gates
4 chỉ cần gán các giá trị mới cho
WILLIAM henry gatES
William Henry Gates
6,
WILLIAM henry gatES
William Henry Gates
7, và
WILLIAM henry gatES
William Henry Gates
8 để update giá trị cho
WILLIAM henry gatES
William Henry Gates
9,

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
0, và

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
1. Ta có output của đoạn code này như sau:

WILLIAM henry gatES
William Henry Gates

Như bạn thấy cả 2 câu lệnh


  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
9 chỉ sử dụng giá trị của
WILLIAM henry gatES
William Henry Gates
9,

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
0, và

  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>
1.

Returning Global Variables

Có một cách tốt hơn để cho phép funcion truy cập một biến được tạo phía bên ngoài đó là khai báo nó có có quyền truy cập global từ bên trong của function. Theo sau từ khoá


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
3 là tên biến, cho phép mọi phần trong code của bạn có full quyền truy cập.


  $a1 = "WILLIAM";
  $a2 = "henry";
  $a3 = "gatES";

  echo $a1 . " " . $a2 . " " . $a3 . "
"
; fix_names(); echo $a1 . " " . $a2 . " " . $a3; function fix_names() { global $a1; $a1 = ucfirst(strtolower($a1)); global $a2; $a2 = ucfirst(strtolower($a2)); global $a3; $a3 = ucfirst(strtolower($a3)); } ?>

Giờ đây bạn không phải truyền các tham số cho function nữa. Sau khi được khai báo, các biến này sẽ giữ lại quyền truy cập global, và được sẵn sàng truy cập trong mọi phần còn lại của program, bao gồm cả functions của nó.

Recap of Variable Scope

Để nhớ lại kiến thức, tôi sẽ tóm tắt lại kiến thức quan trọng về Variable Scope:

  • Local variables chỉ có thể truy cập được trong phạm vi chỗ code mà bạn đã define nó. Nếu nó nằm bên ngoài function, thì nó có thể được truy cập bởi tất cả các code bên ngoài function, class, ...vv. Nếu một biến nằm bên trong một function, thì chỉ có function đó có thể truy cập biến này, và giá trị của biến này sẽ mất khi function được return.
  • Global variables biến này có thể được truy cập từ bất kỳ đâu trong code của bạn
  • Static variables ngược lại với một biến được khai báo như một function parameter - loại mà giá trị sẽ bị phá huỷ khi exit function, thì static variable sẽ không bị mất giá trị khi exit function, và nó sẽ vẫn giữ được giá trị khi function được gọi lại. Ta có thể tham khảo giá trị dưới đây:

   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>

Ta thu được kết quả như sau:

1
2
3

Including and Requiring Files

Khi đã quen thuộc hơn với việc lập trình PHP, có thể bạn sẽ muốn build một library các functions mà bạn nghĩ sẽ cần dùng lại nó trong tương lại. Hoặc có thể bạn muốn sử dụng các library sẵn có do các lập trình viên khác đã viết.
Chúng ta sẽ không cần copy và paste các functions vào code. Vì ta có thể lưu chúng vào các file riêng biệt và dùng command để gọi chúng về. Có 2 command để thực hiện hành động này đó là:


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
4 and

   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
5.

The include Statement

Khi dùng


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
4, bạn sẽ yêu cầu PHP fetch về một file cụ thể và load tất cả nội dung của nó. Nó giống như thể là bạn paste một included file vào file hiện tại. Dưới đây là cách ta include một file tên là library.php.

function function_name([parameter [, ...]]) 
{
 // Statements 
}
0

Using include_once

Mỗi khi bạn đưa ra yêu cầu


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
4, nó sẽ include lại file được đã được yêu cầu include, ngay cả khi bạn đã insert nó rồi. Ví dụ, giả sử rằng file library.php chứa rất nhiều function hữu ích, và bạn include nó vào file, nhưng bạn cũng include một library khác - đang include library.php. Do đó, bạn đã vô tình include file library.php 2 lần. Điều này sẽ gây ra message lỗi, vì bạn đang cố gắng define cùng một constant hay function nhiều lần. Do vậy, bạn nên sử dụng

   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
8 để thay thế cho include.

function function_name([parameter [, ...]]) 
{
 // Statements 
}
1

Sau đó thì dù bạn có cố gắng include file trùng nhau đi nữa (bằng


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
4 hoặc

   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
8) thì nó cũng sẽ được bỏ qua. Để xác định liệu requested file có được executed hay không, thì absolute file path sẽ được matched sau khi relative paths được giải quyết và file được tìm thấy trong include path.

Tips: Nói chung là, bạn nên sử dụng câu lệnh


   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
8 và bỏ qua lệnh

   function keep_track() {
      STATIC $count = 0;
      $count++;
      print $count;
      print "
"
; } keep_track(); keep_track(); keep_track(); ?>
4. Bằng cách này, thì bạn sẽ không bao giờ gặp vấn đề về file bị include nhiều lần.