TỰ HỌC LẬP TRÌNH PHP [VIDEO + VÍ DỤ]

Ngày đăng: 02/03/2021   -    Cập nhật: 05/08/2022
PHP là một trong những ngôn ngữ lập trình web phổ biến nhất và khá là dễ học. Điều này chắc chắn bạn cũng biết.


Thế nên bạn và rất nhiều người đang tìm cách học lập trình PHP để cuối cùng hi vọng trở thành PHP Web DEV (hoặc chỉ đơn giản là học để thi tốt hơn ở trên trường)


Dù cho là lý do gì, mình nghĩ rằng một hướng dẫn tự học lập trình php cơ bản, đầy đủ, rõ ràng, dễ hiểu ở đây sẽ giúp ích cho bạn khi mới bắt đầu.



Tự học Lập trình PHP cơ bản


> Note: Video đang update nha...


Dù có khá nhiều thứ cần phải trình bày, nhưng mình sẽ cố gắng làm ngắn gọn các khái niệm, tập trung vào ví dụ để bạn nhanh chóng nắm bắt được cốt lõi về lập trình PHP. (Đảm bảo dễ dàng cả đối với người mới bắt đầu học lập trình)


Mục lục:





Để chuẩn bị cho việc học PHP thuận lợi, bạn hãy cài đặt Xampp và một phần mềm soạn thảo có thể là Sublime Text, NetBeans, Eclipse, PHP Storm, ... tùy ý (Mình thì sử dụng VS Code).




Và nên nhớ phải cài đặt Port (cổng) trên Xampp đúng để có thể chạy được code PHP

 

 

Sau khi đã cài đặt xong, bây giờ thì bắt đầu ngay thôi nào!


I. CÚ PHÁP PHP CƠ BẢN



Phần này chúng ta sẽ đi tìm hiểu nhanh về PHP, PHP tag, cách xuất dữ liệu trong PHP và cách comment code trong PHP.


I.1. Giới thiệu về PHP



PHP (viết tắt của Hypertext Preprocessor) là một ngôn ngữ kịch bản mã nguồn mở miễn phí, rất phổ biến. Các tập lệnh PHP được thực thi trên máy chủ.


PHP có thể làm:



  • Tạo nội dung trang web động
  • Tạo, mở, đọc, ghi, xóa và đóng tệp trên máy chủ
  • Thu thập dữ liệu biểu mẫu
  • Thêm, xóa và sửa đổi thông tin được lưu trữ trong cơ sở dữ liệu của bạn
  • Kiểm soát quyền truy cập của người dùng
  • Mã hóa dữ liệu
  • và nhiều hơn nữa!


> Lưu ý: Trước khi bắt đầu tự học PHP, bạn nên học qua về HTML nhé.


> ? Có thể bạn chưa biết: Lõi của Wordpress (Hệ thống CMS hàng đầu thế giới) được viết bằng PHP. PHP cũng là một phần của mạng xã hội Facebook!



Và dĩ nhiên, còn có rất nhiều lý do để chọn học PHP:


  • PHP chạy trên nhiều nền tảng khác nhau: Windows, Linux, Unix, Mac OS X, v.v.
  • PHP tương thích với hầu hết mọi máy chủ hiện đại, chẳng hạn như Apache, IIS, v.v.
  • PHP hỗ trợ nhiều loại cơ sở dữ liệu.
  • PHP là miễn phí!
  • Đặc biệt: PHP rất dễ học và tối ưu cho lập trình website.


I.2. PHP Tag



Một đoạn code PHP phải bắt đầu bằng <?php và kết thúc bằng ?>



<?php
    // Code của bạn ở đây
?>
 


PHP có thể nhúng trực tiếp trong thẻ HTML.




Hướng dẫn tạo và chạy dự án PHP với VS Code


Đây là một ví dụ về một tệp PHP đơn giản. Tập lệnh PHP sử dụng một hàm tích hợp sẵn (built-in fucntion) có tên là echo (đọc là ê cô) để xuất ra đoạn text Hello World! đến một trang web.


File index.php



<!DOCTYPE html>
<html lang="en">
<head>
    <title>Tự học PHP</title>
</head>
<body>
    <div>
        <?php
            echo "<h1>Hello World</h1>";
        ?>
    </div>
</body>
</html>
 


> Lưu ý: Câu lệnh PHP kết thúc bằng dấu chấm phảy ;



Ngoài ra, trước đây chúng ta có thể nhúng PHP thông qua thẻ <script>



<html>
<head>
    <title>Chương trình PHP đầu tiên</title>
</head>
<body>
    <script language="php">
        echo "Hello World!";
    </script>
</body>
</html>
 


Nhưng, phiên bản PHP mới nhất loại bỏ hỗ trợ cho các thẻ <script language = "php">.


Vì thế, mình khuyên bạn chỉ nên sử dụng <?php ?> để viết code PHP


Bạn cũng có thể sử dụng các thẻ PHP viết tắt <? ?> miễn là chúng được hỗ trợ bởi máy chủ (Tuy nhiên cách chuẩn nhất vẫn là <?php ?>)




<?
    echo "Hello World!";
?>
 


Và nếu bạn viết trong file có đuôi là .php ví dụ file home.php thì bạn có thể không viết thẻ đóng ?>


Ví dụ như thế này:




<?php
    echo "Hello World!";
 


II.3. Echo



Không sử dụng phương thức print giống như với JAVA hay Python, PHP có một hàm đặc trưng là echo, thường được được sử dụng để xuất văn bản.


Trong thực tế, echo cũng không hoàn toàn là một hàm, nó là một cấu trúc ngôn ngữ. Vì thế, nó không yêu cầu bắt buộc phải có dấu ngoặc đơn ( )


Dĩ nhiên, nếu nội dung cần xuất ra phức tạp, dấu ngoặc đơn ( ) cũng rất hữu ích.


Thử xuất một đoạn text:




<?php
    echo "Học PHP Cơ bản";
?>
 


> Lưu ý: Đoạn text phải nằm trong dấu nháy đơn ' ' hoặc dấu nháy kép " "


Mỗi câu lệnh php đều phải kết thúc bằng một dấu chấm phảy ;



<?php
    echo "Học PHP Cơ bản";
    echo "Lập trình PHP";
    echo "Tự học PHP";
?>
 


Nếu không câu lệnh đó sẽ tạo ra lỗi.


Bạn cũng có thể nhét code HTML vào trong câu lệnh echo.


Ví dụ: Tạo thư mục dự án my-web trong C:\xampp\htdocs. Sau đó, trong my-web ta tạo file index.php, copy > paste đoạn code sau vào:




<!DOCTYPE html>
<html lang="en">
<head>
    <title>Tự học PHP</title>
</head>
<body>
    <div>
        <?php
            echo "<h1>Hello World</h1>";
        ?>
    </div>
</body>
</html>
 


Chạy file trên web theo đường dẫn http://localhost:80/my-web/index.php hoặc http://localhost/my-web/index.php


> Lưu ý: 80 là cổng bạn thiết lập trong Xampp (có thể khác do bạn cấu hình trên xampp), thư mục my-web là thư mục dự án chứa file index.php và được đặt trong thư mục htdocs (Như thế này: C:\xampp\htdocs\my-web)



Kết quả ta được như sau:


Tạo Chương trình PHP đầu tiên


> Lưu ý: Trong các ví dụ trong bài viết này, mình sẽ rất ít đưa code HTML để đảm bảo ví dụ ngắn gọn, rõ ràng. Bạn có test kết quả bằng cách nhét vào file HTML và chạy file .html hoặc chạy thẳng file .php đều được.


I.4. Comment trong PHP



Trong code PHP, comment (chú tích) là một dòng không được thực thi.


Comment được sử dụng để nhận xét, mô tả về ý nghĩa của đoạn code giúp người khác đọc hiểu chương trình của bạn.


Hoặc, chính là giúp bạn đọc hiểu code của mình sau một thời gian không đụng vào nó, tránh tình trạng:



"THẰNG CỜ HÓ NÀO CODE NGU THẾ NÀY"


Comment một dòng bắt đầu bằng //


Ví dụ: Tạo file test.php trong thư mục my-web, dán đoạn code sau vào




<?php   
    echo "<h2>Tự học PHP</h2>";
    
    // Đây là comment 1 dòng
    echo "<p>niithanoi.edu.vn</p>";
?>
 


Chạy file với đường dẫn localhost:80/my-web/test.php, kết quả ta được: 


Comment trong PHP


Còn comment nhiều dòng trong PHP thì bạn sử dụng /* và */, ví dụ:



<?php   
    echo "<h2>Tự học PHP</h2>";
    /*
        Đây là comment nhiều dòng
        trong PHP
    */
    echo "<p>niithanoi.edu.vn</p>";
?>
 


> Mẹo #1: Thông thường, chúng ta cũng thường xuyên comment code để tìm và gỡ lỗi:


<?php   
    //echo "<h2>Tự học PHP</h2>";
    echo "<p>niithanoi.edu.vn</p>";
?>
 


Câu lệnh echo "<h2>Tự học PHP</h2>"; trên bị comment, nó sẽ không được thực thi.


> Mẹo #2: Chọn đoạn code cần comment và nhấn Ctrl + ? để comment code.



II. BIẾN TRONG PHP



Trong phần này chúng ta sẽ tìm hiểu về biến trong PHP, hằng số, các kiểu dữ liệu và phạm vi của biến... 


II.1. Khai báo biến trong PHP



Biến được sử dụng làm 'vùng chứa' để chúng ta lưu trữ thông tin.


Biến PHP bắt đầu bằng dấu đô la $, theo sau là tên của biến:




$ten_bien = gia_tri;
 


Nguyên tắc đặt tên biến:


  • Tên biến phải bắt đầu bằng chữ cái hoặc dấu gạch dưới _
  • Tên biến không được bắt đầu bằng số
  • Tên biến chỉ có thể chứa các ký tự chữ, số và dấu gạch dưới (A-z, 0-9 và _)
  • Tên biến phân biệt chữ hoa chữ thường ($ten$TEN là khác nhau)


Ví dụ:



// Ví dụ biến trong PHP
$ten = "Ngọc Anh";
$tuoi = 18;

echo $ten;
 


Kết quả:



Ngọc Anh
 


> Lưu ý: Trong PHP, húng ta không cần khai báo kiểu dữ liệu (int, float, String như Java). PHP tự động chuyển biến thành kiểu dữ liệu chính xác, tùy thuộc vào giá trị của nó.


> Note: Trong PHP, thông thường tên biến được viết theo kiểu snake_case (chữ thường, cách nhau bằng dấu gạch dưới)


II.2. Hằng số



Hằng số (constant) tương tự như các biến. Nhưng chúng không thể thay đổi hoặc undefined sau khi chúng đã được định nghĩa.


Trong PHP, tên của hằng số bắt đầu bằng một chữ cái hoặc một dấu gạch dưới.


Để tạo một hằng số, hãy sử dụng hàm define():




// Cú pháp tạo hằng số trong PHP
define(name, value, case-insensitive);
 


Trong đó:


  • name: Chỉ định tên của hằng số
  • value: Chỉ định giá trị của hằng số
  • case-insensitive: Chỉ định xem tên hằng có nên phân biệt chữ hoa chữ thường hay không. Mặc định là false


Ví dụ dưới đây tạo một hằng số có tên phân biệt chữ hoa chữ thường:



// Định nghĩa hằng số CÓ phân biệt HOA - thường
define("DOMAIN_NAME""niithanoi.edu.vn");

echo DOMAIN_NAME;
// Kết quả: niithanoi.edu.vn
 


Ví dụ, định nghĩa hằng số không phân biệt chữ hoa, chữ thường:



// Định nghĩa hằng số KHÔNG phân biệt HOA - thường
define("DOMAIN_NAME""niithanoi.edu.vn"true);

echo domain_name;
// Kết quả: niithanoi.edu.vn
 


> Lưu ý: Không cần ký hiệu $ trước tên hằng số


II.3. Các kiểu dữ liệu trong PHP



Trong PHP, các biến có thể lưu trữ nhiều kiểu dữ liệu khác nhau.


Các kiểu dữ liệu được PHP hỗ trợ: String, Integer, Float, Boolean, Array, Object, NULL, Resource.


Kiểu dữ liệu String


String là một chuỗi các ký tự, chẳng hạn như "Học lập trình PHP"


Một chuỗi có thể là bất kỳ văn bản nào trong một tập hợp các dấu nháy kép " " hoặc dấu nháy đơn ' '.




// Sử dụng nháy kép " " để tạo chuỗi
$chuoi1 = "Học PHP";

// Sử dụng nháy đơn ' ' để tạo chuỗi
$chuoi2 = ' niithanoi.edu.vn';
 


Để nối hai chuỗi trong PHP thì bạn có thể sử dụng dấu chấm ., ví dụ:



// Nối chuỗi
echo $chuoi1.$chuoi2;
 


Kết quả:



Học PHP niithanoi.edu.vn
 



Kiểu dữ liệu Int


Int là một số nguyên (không có số thập phân) phải phù hợp với các tiêu chí sau:


  • int không được chứa dấu phẩy hoặc khoảng trống
  • int không được có dấu thập phân
  • int có thể là âm hoặc dương



$soNguyen1 = 42// Số nguyên dương
$soNguyen2 = -42// Số nguyên âm
 


> Lưu ý: Trong PHP, các biến có thể chứa các kiểu dữ liệu khác nhau.


Kiểu dữ liệu Float


Float là một số thập phân, trong PHP thì không cần khai báo kiểu dữ liệu float:




// Số float
$a = 96.69;
 


Kiểu dữ liệu Boolean


Boolean là kiểu dữ liệu logic, nó có hai trạng thái: true hoặc false




// Kiểu boolean
$x = true;
$y = false;
 


Kiểu boolean thì thường được dùng trong kiểm tra điều kiện (sẽ học ở phần sau)


Bạn cũng có thể sử dụng kết hợp các loại dữ liệu trong một chương trình mà không xảy ra vấn đề gì.




// Chuỗi
$input = "10";

// Số nguyên
$x = 10;

// Tính tổng
$tong = $input + $x;

// Xuất tổng
echo $tong;
 


> Lưu ý: Nếu như ở trong JAVA (các ngôn ngữ chặt chẽ) thì điều này là không thể. Nhưng PHP là ngôn ngữ động (giống JavaScript) nên nó tự động chuyển kiểu dữ liệu của biến $input thành kiểu int và tính tổng.


II.4. Phạm vi của biến



Các biến PHP có thể được khai báo ở bất kỳ đâu trong tập lệnh.


Phạm vi của một biến là một phần của tập lệnh, trong đó biến có thể được tham chiếu hoặc sử dụng.



Phạm vi biến được sử dụng nhiều nhất của PHP là cục bộ, toàn cục.


  • Một biến được khai báo bên ngoài một hàm có phạm vi toàn cục.
  • Một biến được khai báo trong một hàm có phạm vi cục bộ và chỉ có thể được truy cập trong hàm đó.


Ví dụ:



// Tạo biến toàn cục
$ten = "Ngọc Anh";

// Tạo một hàm
function getTen() {
    echo $ten;
}

// Gọi hàm
getTen();
 


Kết quả dẫn đến lỗi:



Undefined variable: ten
 


Bởi vì, biến $ten là toàn cục và không thể truy cập được trong hàm getTen().


Để truy cập biến toàn cục từ bên trong hàm. Chúng ta cần sử dụng từ khóa global, như ví dụ sau:




// Tạo biến toàn cục
$ten = "Ngọc Anh";

// Tạo một hàm
function getTen() {
    // Truy cập biến toàn cục
    global $ten;
    echo $ten;
}

// Gọi hàm
getTen();
 


Kết quả:



Ngọc Anh
 


II.5. Biến của biến



Trong PHP, bạn có thể sử dụng một biến để chỉ định tên của biến khác, ví dụ $$a


Nó sẽ coi giá trị của biến $a như là tên của nó.


Ví dụ:




$a = "x";
$x = "Tự học PHP";

echo $$a;
 


Kết quả:



Tự học PHP
 


Bởi vì khi viết $$a thì PHP Engine sẽ hiểu lấy giá trị của biến $a làm tên cho biến mới này.


III. TOÁN TỬ TRONG PHP



Trong phần này, bạn sẽ học về một số loại toán tử phổ biến như toán tử toán học, toán tử gán, toán tử so sánh và toán tử logic.


Có rất nhiều thứ bạn sẽ thấy gần giống trong toán học thế nên mình nghĩ phần này sẽ  khá là đơn giản thôi.



Toán tử trong PHP


III.1. Toán tử toán học



Các toán tử toán học làm việc với các giá trị số để thực hiện các phép toán số học thông thường.


Một số toán tử toán học thông thường



Toán tử toán học trong PHP


Ví dụ:



$a = 5;
$b = 2;

// Phép cộng
echo $a + $b// Kết quả: 7

// Phép trừ
echo $a - $b// Kết quả: 3

// Phép nhân
echo $a * $b// Kết quả: 10

// Phép chia
echo $a / $b// Kết quả: 2.5

// Phép chia lấy phần dư
echo $a % $b// Kết quả: 1
 


Ở đây, chỉ có toán tử % là hơi khác một chút. Toán tử % được sử dụng để tính phép chia lấy phần dư.


Tăng ++ và Giảm --


Trong lập trình, hoạt động tăng, giảm một đơn vị được sử dụng rất phổ biến. Nhưng thay vì viết là $x + 1 thì chúng ta sử dụng toán tử ++



  • Các toán tử ++ được sử dụng để tăng giá trị của một biến.
  • Các toán tử -- được sử dụng để giảm giá trị của một biến.


Chúng ta có thể đặt trước hoặc sau tùy theo nhu cầu:



$a = 5;
$b = 2;

// Đặt sau
$a++;
$a--;

// Đặt trước
++$b;
--$b;
 


Vậy đặt trước, đặt sau thì có gì khác nhau?


Cũng rất đơn giản thôi, ví dụ $a++ được hiểu là tăng sau:



  • Đầu tiên, trả về giá trị hiện tại của $a và sử dụng nó để tính toán biểu thức (nếu có)
  • Sau đó mới tăng $a lên 1


Ví dụ:



$a = 5;

echo $a++ + 2// Kết quả: 7
echo $a// Kết quả: 6
 


Bạn thấy không trong câu lệnh echo $a++ + 2; PHP Engine vẫn lấy giá trị $a5 để tính toán biểu thức.


Sau đó nó mới tăng $a lên 1 đơn vị và trả về cho biến $a.


Tương tự như vậy, ++$a có nghĩa là tăng trước:




$a = 5;

echo ++$a + 2// Kết quả: 8
echo $a// Kết quả: 6
 


Toán tử -- thì cũng tương tự thôi. Đặt trước biến --$a thì là giảm trước, đặt sau biến $a-- thì là giảm sau.


III.2. Toán tử gán



Toán tử gán là toán tử được sử dụng gán giá trị cho biến:



$a = 5;
$b = a;

echo $a// Kết quả: 5
echo $b// Kết quả: 5
 


Toán tử gán cũng có thể sử dụng kết hợp với các toán tử toán học.


Toán tử gán trong PHP


Ví dụ:



$a = 5;

// Sử dụng *=
$a *= 2;

echo $a// Kết quả: 10
 


III.3. Toán tử so sánh



Toán tử so sánh sẽ so sánh giá trị của hai biến với nhau (Có thể là số hoặc chuỗi)


Nếu đúng thì sẽ trả về true và ngược lại sẽ trả về false



Toán tử so sánh trong PHP (1)


Toán tử so sánh này cũng không có gì khó. Hầu như là so sánh toán học cơ bản thôi.


Tuy nhiên, cần chú ý là toán tử =====



  • Trong khi == so sánh giá trị, không quan tâm đến kiểu dữ liệu. Nghĩa là 10 == "10" sẽ trả về true

  • Nhưng === so sánh cả giá trị và kiểu dữ liệu, 10 === "10" sẽ trả về false


Ngoài ra, các toán tử so sánh sau cũng rất hay được sử dụng:

Toán tử so sánh trong PHP (2)

III.4. Toán tử Logic



Toán tử logic được sử dụng để kết hợp các câu lệnh điều kiện


Toán tử Logic trong PHP


Ví dụ: Kiểm tra xem, nếu $a lớn hơn 10$a lớn hơn $b thì in ra Đúng. Ngược lại thì in ra Sai



$a = 5;
$b = 3;

if(( $a > 10 ) && ( $a > $b )) {
    echo "Đúng";
else {
    echo "Sai";
}
 


Kết quả:



Sai
 


> Lưu ý: Nếu nhiều điều kiện kết hợp thì tốt nhất bạn nên sử dụng thêm các cặp ngoặc tròn ( )


IV. MẢNG TRONG PHP



Trong phần này, bạn sẽ học về kiểu dữ liệu đặc biệt đó là Mảng.


Một mảng có thể chứa nhiều hơn một giá trị tại một thời điểm.


Bình thường, bạn có một danh sách tên sinh viên, sử dụng biến bạn sẽ lưu trữ tên sinh viên như sau:




$sinhVien1 = "Ngọc Anh";
$sinhVien2 = "Thu Hương";
$sinhVien3 = "Vũ Hà";
 


Số lượng sinh viên ít thì còn có thể, nhưng 1000 sinh viên thì không thể lưu trữ như thế được.


Do đó, chúng ta cần sử dụng mảng.



IV.1. Mảng chỉ số



Mảng chỉ số là một mảng, trong đó, các giá trị sẽ được đánh dấu vị trí (chỉ mục) tự động từ 0 (Luôn luôn đánh thứ tự từ 0)


Ví dụ, ta có:




$arr = array("A""B""C""D""E");
 


Trong đó:


  • $arr là tên mảng (bạn đặt tùy ý)
  • array là từ khóa để tạo mảng trong PHP


Mảng trong PHP


Bạn cũng có thể gán thủ công như sau:



// Gán giá trị cho mảng
// theo chỉ mục (index)
$arr[0] = "A";
$arr[1] = "B";
$arr[2] = "C";
$arr[3] = "D";
$arr[4] = "E";
 


Bây giờ, chúng ta có thể truy cập vào giá trị của mảng bằng cách sử dụng index.



echo $arr[1]; // Kết quả: B
 


Ngoài ra, giá trị của mảng cũng có thể là nhiều kiểu dữ liệu khác nhau:



// Mảng PHP có thể chứ nhiều loại giá trị
$arr = array(0"Không"false);

echo $arr[0].$arr[1]; // kết quả: 0Không
 


Chúng ta cũng có thể sử dụng index để gán lại giá trị trong mảng (thay đổi giá trị trong mảng)



// Mảng
$arr = array(12345);

// Thay đổi giá trị đầu tiên của mảng
$arr[0] = 10;

// In ra giá trị đầu tiên của mảng
echo $arr[0];
 


Kết quả:



10
 


IV.2. Mảng liên kết



Mảng liên kết trong PHP cũng là một mảng nhưng mảng liên kết chứa các cặp key => value


Cũng có hai cách để tạo mảng liên kết:



// Cách 1
$arr = array("Ngọc Anh" => 18"Thu Hương" => 19"Vũ Hà" => 20);
 


Hoặc:



// Cách 2
$arr["Ngọc Anh"] = 18;
$arr["Thu Hương"] = 19;
$arr["Vũ Hà"] = 20;
 


> Lưu ý: Trong mảng liên kết, chúng ta sử dụng ký hiệu => để gán giá trị cho key


Và để truy cập giá trị đó, chúng ta sử dụng key thay vì index như mảng chỉ số.



// Mảng
$arr = array("Ngọc Anh" => 18"Thu Hương" => 19"Vũ Hà" => 20);

// Truy cập giá trị theo key
echo $arr["Ngọc Anh"]; // Kết quả: 18
 


Và cũng sử dụng key để thay đổi giá trị:



// Thay đổi lại giá trị theo key
$arr["Ngọc Anh"] = 20;

echo $arr["Ngọc Anh"]; // Kết quả: 20
 


IV.3. Mảng đa chiều



PHP cho phép bạn tạo và sử dụng mảng đa chiều. Trong đó, mảng đa chiều có thể chứa hơn một mảng.


Các mảng con sẽ được đánh thứ tự tự động như mảng chỉ số (hoặc theo tên chỉ định):



  • Đối với mảng hai chiều, bạn cần hai chỉ số để chọn một phần tử
  • Đối với mảng ba chiều, bạn cần ba chỉ số để chọn một phần tử


Bạn có thể thêm vào bao nhiêu mảng con tùy ý. Nhưng mảng 3 chiều trở lên sẽ rất khó quản lý, truy xuất chậm.


Ví dụ về mảng 2 chiều:




// Tạo mảng 2 chiều
$arr = array(
    "Sinh viên" => array("Ngọc Anh""Thu Hương"),
    "Giảng viên" => array("Thành Luân""Trọng Triều""Văn Quyết"),
    "Bảo vệ" => array("Khánh""Đức")
);
 


Truy xuất giá trị trong mảng 2 chiều:



echo $arr["Sinh viên"][1]; // Kết quả: Thu Hương
 


Bạn cũng có thể không cần sử dụng key để tạo mảng con bên trong:



// Tạo mảng 2 chiều
$arr = array(
    array("Ngọc Anh""Thu Hương"),
    array("Thành Luân""Trọng Triều""Văn Quyết"),
    array("Khánh""Đức")
);
 


Khi đó truy xuất giá trị bạn sẽ sử dụng index:



echo $arr[1][1]; // Kết quả: Trọng Triều
 


Mảng đa chiều có thể vừa chứa mảng liên kết vừa chứa mảng chỉ số:



// Tạo mảng 2 chiều
// chứa mảng chỉ số và mảng liên kết
$arr = array(
    "Sinh viên" => array("Ngọc Anh""Thu Hương"),
    "Giảng viên" => array("Thành Luân""Trọng Triều""Văn Quyết"),
    array(
        "Khánh" => 20,
        "Đức" => 30
    )
);
 


V. CẤU TRÚC ĐIỀU KHIỂN TRONG PHP



Trong phần này bạn sẽ học về các cấu trúc điều kiệncác cấu trúc lặp để điều khiển chương trình PHP một cách thông minh, linh hoạt.


Đối với mỗi điều kiện khác nhau chúng ta sẽ điều khiển chương trình thực thi các quyết định khác nhau.



V.1. Câu lệnh IF ELSE trong PHP



Câu lệnh if else được sử dụng để thực thi một hành động nhất định nếu một điều kiện là đúng và một hành động khác khác nếu điều kiện là sai.


Cú pháp câu lệnh if else:




if (condition) {
    // Đoạn code thực thi
    // Nếu điều kiện đánh giá là true
else {
    // Đoạn code thực thi
    // Nếu điều kiện đánh giá là false
}
 


Trong đó:


  • condition là điều kiện sẽ được đánh giá đúng / sai để quyết định hành động tiếp theo.


Bạn cũng có thể không cần sử dụng câu lệnh else nếu bạn không cần làm gì khi điều kiện sai, như thế này:



if (condition) {
    // Đoạn code thực thi
    // Nếu điều kiện đánh giá là true
}
 


Ví dụ: Cho hai số a, b. Xuất ra số lớn hơn.



$a = 5;
$b = 10;

// Xuất ra số lớn hơn
if ($a > $b) {
    echo $a;
else {
    echo $b;
}
 


Kết quả:



10
 


Thêm nữa, bạn cũng có thể bỏ qua dấu ngoặc nhọn { } nếu chỉ có một câu lệnh đơn giản:



// Có thể bỏ qua dấu {}
if ($age < 14)
    echo "Chưa đủ tuổi yêu";
else
    echo "Lớn rồi";
 


Kết quả:



Lớn rồi
 


V.2. Câu lệnh IF ELSEIF  ELSE trong PHP



Trong PHP, bạn cũng có thể sử dụng câu lệnh if elseif else nếu muốn chuyển sang kiểm tra điều kiện tiếp theo nếu điều kiện trước bị sai.


Cú pháp if elseif else:




if (condition) {
    // Code thực thi
    // Nếu điều kiện đánh giá là true
elseif (condition) {
    // Code thực thi
    // Nếu điều kiện trên đánh giá là true
else {
    // Code thực thi
    // Nếu điều kiện trên đánh giá là false
}
 


Ví dụ: Kiểm tra tuổi để xem là Trưởng thành, Thanh niên hay chưa đủ tuổi yêu



$age = 21;

if ($age < 14) {
    echo "Chưa đủ tuổi yêu";
elseif ($age >= 14 && $age < 18) {
    echo "Thanh niên";
else {
    echo "Trưởng thành";
}
 


Kết quả:



Trưởng thành
 


Ở ví dụ trên, chúng ta sử dụng toán tử && để đánh giá tuổi nằm trong khoảng >=14 tuổi và < 18 tuổi.


Khi viết code, bạn có thể muốn lặp lại một hành động nhiều lần. Thay vì viết thêm code gần như bằng nhau trong một tập lệnh, chúng ta có thể sử dụng các vòng lặp để thực hiện một tác vụ như thế này.


PHP hỗ trợ các loại vòng lặp như:



  • while
  • do while
  • for
  • foreach


V.3. Vòng lặp while



Vòng lặp while thực thi một khối code miễn là điều kiện vẫn được đánh giá là đúng (true)


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




while (condition) {
    // Hành động cần thực hiện lặp lại
    // khi điều kiện còn đúng
}
 


> Lưu ý: Nếu điều kiện không bao giờ sai, vòng lặp sẽ chạy vĩnh viễn. Điều này có thể dẫn đến máy bị "đơ". Thế nên hãy cẩn thận!


Trong ví dụ dưới đây, Vòng lặp while chạy với điều kiện $i nhỏ hơn 7 ($i < 7). Vòng chạy đầu tiên biến $i là 1 ($i = 1). .


Mỗi vòng lặp, $i sẽ tăng một lần ($i++), khi $i bằng 7, thoát khỏi vòng lặp.




$i = 1;

while($i < 7) {
    echo "Vòng lặp thứ: $i <br/>";
    $i++;
}
 


Kết quả:



Vòng lặp thứ: 1
Vòng lặp thứ: 2
Vòng lặp thứ: 3
Vòng lặp thứ: 4
Vòng lặp thứ: 5
Vòng lặp thứ: 6
 


V.4. Vòng lặp do while



Vòng lặp do while tương tự như vòng lặp while, nhưng sẽ luôn thực thi khối code một lần cho dù điều kiện đúng hay sai.


Từ vòng lặp thứ 2, nếu điều kiện còn đúng thì chương trình vẫn tiếp tục thực hiện vòng lặp.


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




do {
    // Code thực thi 1 lần và tiếp tục
    // thực thi khi điều kiện còn đúng
while (condition);
 


Trong đó:

  • condition là điều kiện sẽ được đánh giá Đúng / Sai từ vòng lặp thứ 2 trở đi

Ví dụ vòng lặp do while:



$i = 1;

do {
    echo "Vòng lặp thứ: $i <br/>";
    $i++;
while ($i < 7);
 


Kết quả ta được:



Vòng lặp thứ: 1
Vòng lặp thứ: 2
Vòng lặp thứ: 3
Vòng lặp thứ: 4
Vòng lặp thứ: 5
Vòng lặp thứ: 6
 


Kết quả bạn thấy giống vòng lặp while không?


Để thấy sự khác nhau, chúng ta sửa lại điều kiện một chút:




$i = 1;

do {
    echo "Vòng lặp thứ: $i <br/>";
    $i++;
while ($i < 0);
 


Kết quả khi chạy chương trình:



Vòng lặp thứ: 1
 


Bởi vì vòng lặp do while kiểm tra điều kiện sau nên dù điều kiện đúng hay sai nó cũng chạy ít nhất 1 lần.


Sau đó, khi kiểm tra điều kiện thấy sai thì thoát vòng lặp. Do đó, ta được kết quả như trên.


> Chú ý: Vòng lặp while và do while được sử dụng tốt nhất trong trường hợp bạn không biết trước chắc chắn số lần lặp.



V.5. Vòng lặp for trong PHP



Vòng lặp for trong PHP (cũng như các ngôn ngữ khác) được sử dụng khi bạn biết trước số lần lặp.


Cú pháp vòng lặp for:




for (init; test; increment) {
    // Code thực thi
}
 


Trong đó:


  • init: Khởi tạo giá trị bộ đếm của vòng lặp
  • test: Biểu thức sẽ được đánh giá trong mỗi lần lặp. Nếu true, chạy code. Nếu false, thoát vòng lặp.
  • increment: Tăng giá trị của bộ đếm vòng lặp


> Lưu ý: Mỗi biểu thức tham số của vòng lặp for có thể để trống hoặc chứa nhiều biểu thức được phân tách bằng dấu phẩy ;.


Ví dụ vòng lặp for:




for ($i = 0$i < 7$i++) {
    echo "Vòng lặp thứ: $i<br/>";
}
 


Kết quả:



Vòng lặp thứ: 0
Vòng lặp thứ: 1
Vòng lặp thứ: 2
Vòng lặp thứ: 3
Vòng lặp thứ: 4
Vòng lặp thứ: 5
Vòng lặp thứ: 6
 


Trong ví dụ này, đầu tiên đặt $i bằng 0, sau đó kiểm tra điều kiện $i < 7


  • Nếu đúng thì thực thi câu lệnh: echo "Vòng lặp thứ: $i";
  • Tiếp đó, sau khi thực hiện câu lệnh trong phần thân. Lúc này chương trình sẽ thực hiện tăng bộ đếm $i++
  • Sau đó, bắt đầu vòng lặp tiếp theo... cho đến khi điều kiện đánh giá là sai.
  • Nếu sai, thoát vòng lặp



> Cảnh báo: Hãy cẩn thận! Nếu bạn bỏ quên điều kiện kiểm tra hoặc điều kiện kiểm tra luôn đúng thì có thể sẽ tạo ra vòng lặp vô hạn.


 

V.6. Vòng lặp foreach trong PHP



Vòng lặp foreach trong PHP được tạo ra chỉ để lặp qua các phần tử trong mảng bao gồm cả mảng chỉ số và mảng liên kết.


Cú pháp vòng lặp foreach:




// Lặp qua mảng chỉ số
foreach ($array as $value) {
    // Code thực thi
}

// Lặp qua mảng liên kết
foreach ($array as $key => $value) {
    // Code thực thi
}
 


Trong đó:


  • $array là mảng bạn muốn lặp qua
  • $value là đại diện cho giá trị (phần tử) trong mảng chỉ số
  • $key => $value là đại diện cho cặp key: value trong mảng liên kết



Sử dụng foreach lặp qua mảng chỉ số:

 

  • Trên mỗi lần lặp, giá trị của phần tử hiện tại được gán cho $value và con trỏ mảng được di chuyển qua từng phần tử cho đến phần tử mảng cuối cùng.


 

Ví dụ sau minh họa một vòng lặp xuất ra các giá trị của mảng $sinhVien.

 


// Mảng chỉ số
$sinhVien = array("Ngọc Anh""Hà""Hương");

// Lặp qua từng phần tử với foreach
foreach ($sinhVien as $sv) {
    echo $sv."<br/>";
}
 



Kết quả:

 


Ngọc Anh

Hương
 

 


Sử dụng lặp foreach trên mảng liên kết:

 

  • Mỗi lần lặp, mỗi cặp key: value tương ứng của mảng sẽ được gán cho biến $key và $value, lặp lại qua từng phần tử cho đến cuối mảng.


Còn đây là ví dụ sử dụng vòng lặp foreach để lặp qua mảng liên kết:

 


// Mảng liên kết
$sinhVien = array(
    "Ngọc Anh" => 18,
    "Hà" => 19,
    "Hương" => 22
);

// Lặp qua từng phần tử với foreach
foreach ($sinhVien as $ten => $tuoi) {
    echo "$ten$tuoi tuổi"."<br/>";
}
 



Kết quả:

 


Ngọc Anh: 18 tuổi
Hà: 19 tuổi
Hương: 22 tuổi
 


 

V.7. Switch Case trong PHP



Câu lệnh switch case là một giải pháp thay thế cho câu lệnh if elseif else.


Chúng ta sử dụng câu lệnh switch case để đánh giá điều kiện, sau đó chọn một trường hợp thỏa mãn để thực thi. Nếu không thì mặc định thực thi khối lệnh nào đó (nếu có)



Cú pháp switch case:

 


switch (n) {
    case value1:
        // Code thực thi nếu n bằng value 1
        break;
    case value2:
        // Code thực thi nếu n bằng value 2
        break;
    ...
    default:
        // Code thực thi nếu không có
        // trường hợp nào thỏa mãn
}
 



Đầu tiên, biểu thức đơn của chúng ta n (thường là một biến) sẽ được đánh giá 1 lần.


Nếu giá trị nào trong các trường hợp (case) khớp thì chương trình sẽ thực thi khối code bên trong case đó.


Và nếu không trường hợp nào khớp thì chương trình sẽ thực thi khối code bên trong default.


Chúng ta sẽ làm một ví dụ cổ điển để thông báo các ngày trong tuần:


 


$today = "Sat";

switch ($today) {
    case "Mon":
        echo "Thứ Hai";
        break;
    case "Tue":
        echo "Thứ Ba";
        break;
    case "Wed":
        echo "Thứ Tư";
        break;
    case "Thu":
        echo "Thứ Năm";
        break;
    case "Fri":
        echo "Thứ Sáu";
        break;
    case "Sat":
        echo "Thứ Bảy";
        break;
    case "Sun":
        echo "Chủ Nhật";
        break;
    default:
        echo "Thứ không hợp lệ";
}
 



Kết quả ta được:

 


Thứ Bảy
 



Từ khóa break ở đây được thêm vào để đảm bảo thoát khỏi switch sau khi thực thi case phù hợp.


Nếu ta bỏ quên thì nó sẽ thực thi ngay case tiếp theo mà không cần biết có khớp hay không (cho đến khi gặp break hoặc default)


Ví dụ: Chúng ta thử loại bỏ breakcase "Sat" và chạy lại chương trình.


 


$today = "Sat";

switch ($today) {
    case "Mon":
        echo "Thứ Hai";
        break;
    case "Tue":
        echo "Thứ Ba";
        break;
    case "Wed":
        echo "Thứ Tư";
        break;
    case "Thu":
        echo "Thứ Năm";
        break;
    case "Fri":
        echo "Thứ Sáu";
        break;
    case "Sat":
        echo "Thứ Bảy";
        // Bỏ break
    case "Sun":
        echo "Chủ Nhật";
        break;
    default:
        echo "Thứ không hợp lệ";
}
 


Kết quả:

 


Thứ BảyChủ Nhật
 



> Note: Mình không có thêm thẻ <br/> để cho bạn dễ nhìn code switch case. Nếu muốn kết quả xuống hàng thì bạn nối vào trong câu lệnh echo là được.


Bạn cũng có thể lợi dụng hành vi của break để khiến PHP thực hiện cùng câu lệnh cho các trường hợp khác nhau.


Ví dụ: Sử dụng switch case, nếu là thứ 2, 3, 4, 5, 6 thì thông báo là "Ngày làm việc". Nếu là thứ 7, Chủ nhật thì thông báo là "Cuối tuần". Ngược lại thì không báo "Lỗi dữ liệu"


 


$today = "Sat";

switch ($today) {
    case "Mon":
    case "Tue":
    case "Wed":
    case "Thu":
    case "Fri":
        echo "Ngày làm việc";
        break;
    case "Sat":
    case "Sun":
        echo "Cuối tuần";
        break;
    default:
        echo "Lỗi dữ liệu";
}
 



Kết quả:

 


Cuối tuần
 



Còn trường hợp default trong switch sẽ được thực thi khi không có case khớp, ví dụ:

 


$today = "Sat";

switch ($today) {
    case "Mon":
        echo "Thứ Hai";
        break;
    case "Tue":
        echo "Thứ Ba";
        break;
    case "Wed":
        echo "Thứ Tư";
        break;
    case "Thu":
        echo "Thứ Năm";
        break;
    case "Fri":
        echo "Thứ Sáu";
        break;
    case "Sat":
        echo "Thứ Bảy";
        break;
    case "Sun":
        echo "Chủ Nhật";
        break;
    default:
        echo "Thứ không hợp lệ";
}
 



Kết quả ta được:

 


Thứ không hợp lệ
 



> Lưu ý: Trường hợp default là tùy chọn, bạn có thể bỏ qua nó.

 

V.8. Câu lệnh break và continue



Ý nghĩa của câu lệnh break như bạn đã biết ở phần switch case bên trên, nó được sử dụng để thoát khỏi chương trình ngay lập tức.


Tuy nhiên, không phải chỉ có thể sử dụng ở trong switch case.


Câu lệnh break cũng có thể sử dụng trong vòng lặp forwhiledo whileforeach. Khi đó câu lệnh sẽ khiến chương trình thoát khỏi vòng lặp ngay lập tức.


Chúng ta sẽ làm ví dụ đơn giản như ở bên dưới:


 

 
for ($i 0$i <= 5$i++) {
    echo $i."<br/>";
    if ($i == 3) {
        echo "i = $i. Thoát vòng lặp for";
        // Thoát khỏi vòng lặp for
        break;
    }
}
 



Kết quả:

 


0
1
2
3
i = 3. Thoát vòng lặp for
 



Như bạn thấy, chương trình không in ra 4 mà thoát ngay khỏi vòng lặp từ lúc $i bằng 3.


Nếu bạn đặt ở bên ngoài tập lệnh (Không đặt trong vòng lặp, switch...), lệnh break sẽ dừng tập lệnh ngay (không thực thi các câu lệnh bên dưới nữa)


Ngoài break, chúng ta còn có từ khóa continue.


Ý nghĩa như tên của nó, continue giúp nhảy ngay sang vòng lặp tiếp theo


Ví dụ: Cũng sử dụng ví dụ trên, nhưng khi i bằng 3, chúng ta sẽ sử dụng continue để bỏ qua lần lặp đó để sang ngay lần lặp tiếp theo.


 


for ($i = 0$i <= 5$i++) {

    // Nếu i bằng 3 thì
    // nhảy sang vòng lặp tiếp theo
    if ($i == 3) {
        continue;
    }

    echo $i."<br/>";
}
 



Kết quả:

 


0
1
2
4
5
 



Như bạn thấy đó, kết quả là 3 không được in ra vì trong lần lặp đó chúng ta đã sử dụng từ khóa continue.


> Lưu ý: Bạn có thể sử dụng từ khóa continue trong tất cả các cấu trúc lặp.


 

V.9. Incule và Require



Câu lệnh includerequire cho phép chèn nội dung của một tệp PHP vào tệp PHP khác, trước khi máy chủ thực thi nó.


Câu lệnh include


Trong lập trình web php thực tế việc sử dụng include để chèn nội dung giúp tiết kiệm khá nhiều công việc.


Thông thường, trong website, có nhiều phần sẽ giống nhau. Ví dụ header, footer và menu...


Vì thế, thay vì mỗi trang chúng ta lại viết lại thì ta tách từng phần ra file khác nhau để module hóa.


Bạn có thể tạo tệp header.php, footer.php hoặc menu.php chuẩn cho tất cả các trang trên web của mình.


Sau đó, khi cần cập nhật header thì bạn chỉ cần vào file header.php để thay đổi và PHP tự động áp dụng trên toàn bộ trang web.


Giả sử, chúng ta tạo một file header.php như sau:




<?php
  echo '<h1>Học lập trình PHP</h1>';
?>
 


Bây giờ, chúng ta có thể chèn file header.php vào các trang khác, ví dụ trang index.php bằng câu lệnh include:



<html>
  <body>

    <!-- Chèn file header.php với câu lệnh include -->
    <?php include 'header.php'?>

    <p>Học PHP cơ bản</p>
    <p>Học PHP OOP</p>
  </body>
</html>
 


Trước khi máy chủ thực thi chương trình, nội dung file header.php sẽ được chèn vào file index.php


Cũng bằng cách này, bạn có thể thêm file header.php vào nhiều trang khác bằng lệnh include. Sau này thay đổi code, sửa chữa, phát triển thêm header cũng chỉ cần làm việc với 1 file là được.


> Lưu ý: Các tệp được include dựa trên đường dẫn tệp.


Câu lệnh require



Câu lệnh require cũng tương tự như câu lệnh include nhưng khác ở cách ứng xử khi không tìm thấy file.



  • Khi sử dụng câu lệnh include, nếu không tìm thấy file thì tập lệnh vẫn tiếp tục thực thi.
  • Trong khi sử dụng câu lệnh require, nếu không tìm thấy file, tập lệnh sẽ ngừng thực thi và tạo ra lỗi.


 

VI. HÀM TRONG PHP



Hàm (Function) là một khối câu lệnh có thể được sử dụng lặp lại trong một chương trình.


Một hàm sẽ không thực thi ngay lập tức. Nó sẽ chỉ được thực thi khi chúng ta gọi đến nó.


Có hai loại hàm trong PHP:


 

  • Built-in Function: Hàm được dựng sẵn, chúng ta chỉ việc gọi để sử dụng nó (Ví dụ: array(), asort()...)

  • User-defined Function: Hàm do người dùng tự định nghĩa, tùy biến theo nhu cầu cụ thể.


VI.1. User-defined Function



Cú pháp hàm (User-defined function) trong PHP:



function funtionName() {
  // Code của hàm
}
 


Trong đó:


  • function: Là từ khóa để thông báo rằng chúng ta đang tạo ra một hàm
  • functionName: Là tên hàm của bạn.


Cách đặt tên hàm:


  • Không bắt đầu bằng chữ số hoặc ký tự đặc biệt
  • Có thể bắt đầu bằng dấu gạch dưới
  • Nên bắt đầu bằng một chữ thường là động từ
  • Các hàm tiêu chuẩn trong PHP được định nghĩa theo kiểu snake_case, nhưng trong PSR-1, tên phương thức phải được định nghĩa theo kiểu camelCase
  • Tên hàm phân biệt HOA - thường


Trong ví dụ dưới đây, chúng ta định nghĩa một hàm chaoHoi().



function chaoHoi() {
  // Code của hàm
  echo "Chào bạn";
}
 


Đến đây, tạm thời chương trình chưa thực thi cái gì cả, chuỗi "Chào bạn" cũng chưa được in ra. Bởi vì chúng ta mới chỉ định nghĩa, chưa có sử dụng.


Để sử dụng hàm, chúng ta phải gọi đến nó:




function chaoHoi() {
  // Code của hàm
  echo "Chào bạn";
}

// Gọi hàm
chaoHoi();
 


Kết quả, trên màn hình hiện ra:



Chào bạn
 


VI.2. Hàm có tham số



Các hàm không chứa tham số có mức độ linh hoạt không cao. Do đó, để tạo ra các chức năng tùy biến, linh hoạt chúng ta sẽ thường sử dụng hàm có tham số.


  • Các tham số được truyền vào hàm như các biến.
  • Các tham số được chỉ định sau tên hàm và trong dấu ngoặc đơn.


Ở ví dụ bên dưới đây, hàm của chúng ta nhận một tham số, bình phương nó và in ra kết quả:



// Hàm tính bình phương
function tinhBinhPhuong($x) {
  $x = $x * $x;
  echo $x;
}
 


Bây giờ, chúng ta có thể sử dụng hàm tinhBinhPhuong để tính bình phương các số mà chúng ta muốn.



// Gọi hàm
tinhBinhPhuong(9); // Kết quả: 81
tinhBinhPhuong(4); // Kết quả: 16
tinhBinhPhuong(5); // Kết quả: 25
 


Bạn cũng có thể thêm nhiều tham số, phân tách nhau bằng dấu phẩy ,


Ví dụ:



// Hàm tính vận tốc
function tinhVanToc($quang_duong$thoi_gian) {
  $van_toc = $quang_duong / $thoi_gian;
  echo "Vận tốc bằng: $van_toc m/s";
}
 


Bây giờ chúng ta gọi hàm để tính vận tốc:



// Quãng đường 1000 m
// Thời gian đi hết là: 60s
// Tính vận tốc
tinhVanToc(100060);
 


Kết quả:



Vận tốc bằng: 16.666666666667 m/s
 


> Lưu ý: Khi bạn định nghĩa hàm thì biến truyền cho hàm được gọi là tham số (parameters), nhưng khi gọi hàm, truyền giá trị vào thì nó được gọi là đối số (argument).


VI.3. Đối số mặc định của hàm



Trong nhiều trường hợp gọi hàm có đối số, người dùng có thể truyền thiếu đối số, dẫn đến lỗi. Vì thế, đối số mặc định là một giải pháp cho vấn đề này.


  • Nếu truyền đủ đối số, hàm sẽ lấy đối số bạn truyền để tính toán
  • Khi truyền thiếu đối số, hàm sẽ tự động lấy giá trị mặc định để tính toán.



Ví dụ:



// Hàm chứa đối số mặc định
function setThongTin($ten$tuoi = "không rõ") {
  echo "Tên: $ten - Tuổi $tuoi";
}
 


Bây giờ, chúng ta thử gọi hàm và truyền vào cho nó đầy đủ đối số:



// Gọi hàm có truyền đối số đầy đủ
setThongTin("Ngọc Anh"18);
 


Kết quả:



Tên: Ngọc Anh - Tuổi: 18
 


Bây giờ, thử truyền thiếu đối số tuổi xem thế nào nhé:



// Cố tình truyền thiếu đối số
setThongTin("Vũ Hà");
 


Kết quả ta được:



Tên: Vũ Hà - Tuổi: không rõ
 


> Lưu ý: Bạn cần đặt những đối số mặc định ở cuối, nếu không hàm sẽ không hoạt động đúng mong đợi. 


VI.4. Kiểu dữ liệu đối số trong PHP 7



PHP là ngôn ngữ động, do đó nó sẽ tự động liên kết kiểu dữ liệu với biến, ví dụ:



// Hàm tính vận tốc
function tinhVanToc($quang_duong$thoi_gian) {
  $van_toc = $quang_duong / $thoi_gian;
  echo "Vận tốc bằng: $van_toc m/s";
}
 


Bây giờ, thay vì truyền dữ liệu kiểu số, ta thử truyền chuỗi xem thế nào nhé:



tinhVanToc("1000"60);
 


Kết quả:



Vận tốc bằng: 16.666666666667 m/s
 


Trong PHP7, khai báo kiểu dữ liệu đã được thêm vào. Chúng ta có thể khai báo kiểu dữ liệu cho các đối số:



// Hàm tính vận tốc
function tinhVanToc(int $quang_duongint $thoi_gian) {
  $van_toc = $quang_duong / $thoi_gian;
  echo "Vận tốc bằng: $van_toc m/s";
}

tinhVanToc("1000 mét"60);
 


Nếu chỉ thêm khai báo kiểu dữ liệu cho đối số như vậy, kết quả là chương trình vẫn thực thi được, kết quả vẫn nhận được:



Vận tốc bằng: 16.666666666667 m/s
 


Tuy nhiên, nó còn đi kèm một chú ý:



Notice: A non well formed numeric value encountered
 


Do đó, trong nhiều trường hợp để kích hoạt chế độ nghiêm ngặt trong kiểu dữ liệu của đối số thì bạn cần khai báo chế độ strict ở đầu tập lệnh:



<?php declare(strict_types=1);
 


Điều này sẽ dẫn tới kích hoạt lỗi nghiêm trọng, dừng thực thi chương trình nếu dữ liệu truyền vào không khớp.



<?php declare(strict_types=1);

// Hàm tính vận tốc
function tinhVanToc(int $quang_duongint $thoi_gian) {
  $van_toc = $quang_duong / $thoi_gian;
  echo "Vận tốc bằng: $van_toc m/s";
}

tinhVanToc("1000 mét"60);
 


Dữ liệu truyền vào không khớp dẫn tới một lỗi nghiêm trọng.


Điều này, bắt buộc lập trình viên phải lưu ý trong việc xử lý dữ liệu đầu vào để tránh các ngoại lệ không mong muốn, buộc mọi thứ phải hoạt động theo cách đã định.



VI.5. Return trong PHP7



Trong PHP, Một hàm có thể trả về một giá trị bằng cách sử dụng câu lệnh return.


Câu lệnh return sẽ dừng thực thi hàm và gửi giá trị trở lại lệnh gọi.




// Hàm tính vận tốc
function tinhVanToc($quang_duong$thoi_gian){
  $van_toc = $quang_duong / $thoi_gian;
  return $van_toc;
}

echo tinhVanToc(100060);
 


Kết quả:



16.666666666667
 


> Lưu ý: Nếu bỏ qua return, hàm về sẽ trả về giá trị NULL. Và một hàm không thể trả về nhiều giá trị, nhưng trả về một mảng sẽ tạo ra kết quả tương tự.



Từ PHP 7, chúng ta có thể khai báo kiểu cho câu lệnh return.


Giống như với khai báo kiểu cho các đối số của hàm, bằng cách kích hoạt chế độ strict, nó sẽ tạo ra lỗi nghiêm trọng "Fatal Error" nếu kiểu trả về không khớp.


Ví dụ:




<?php declare(strict_types=1);

// Hàm tính vận tốc
function tinhVanToc(int $quang_duongint $thoi_gian) : int{
  $van_toc = $quang_duong / $thoi_gian;
  return $van_toc;
}

echo tinhVanToc(100060);
 


Kết quả chương trình trên sẽ ném ra một lỗi "Fatal Error".


Do đó bạn cần điều chỉnh kiểu dữ liệu trả về cho đúng với khai báo. Ở đây, chúng ta có thể chuyển đổi kết quả thành kiểu int, như sau:




<?php declare(strict_types=1);

// Hàm tính vận tốc
function tinhVanToc(int $quang_duongint $thoi_gian) : int{
  $van_toc = $quang_duong / $thoi_gian;
  return (int)$van_toc;
}

echo tinhVanToc(100060);
 


Kết quả:



16
 


VI.6. Truyền tham chiếu



Trong PHP, các đối số thường được truyền theo giá trị, có nghĩa là một bản sao của giá trị được sử dụng trong hàm và biến được truyền vào hàm không thể thay đổi.


Tuy nhiên, chúng ta cũng có thể tạo ra các hàm linh hoạt hơn nữa bằng cách truyền bằng tham chiếu (pass by reference), các thay đổi đối với đối số cũng thay đổi biến được truyền vào.


Để biến đối số hàm thành tham chiếu, chúng ta sử dụng toán tử &:




function congDiem(&$diem) {
  $value += 3;
}

$diem = 4;
congDiem($diem);

// Biến $diem hiện tại
// có giá trị là:
echo $diem;
 


Kết quả:



7
 


 

VII. Siêu biến trong PHP



Siêu biến (Superglobal) là một biến được xác định trước luôn có thể truy cập được, bất kể phạm vi.


Bạn có thể truy cập các superglobals trong PHP thông qua bất kỳ hàm, lớp hoặc tệp nào.


Các biến superglobal của PHP là $_SERVER, $GLOBALS, $_REQUEST, $_POST, $_GET, $_FILES, $_ENV, $_COOKIE, $_SESSION.



VII.1. $_SERVER trong PHP



$_SERVER là một mảng bao gồm thông tin như tiêu đề, đường dẫn và vị trí tập lệnh. Các item trong mảng này được tạo bởi máy chủ web.


$_SERVER['SCRIPT_NAME'] trả về đường dẫn của tập lệnh hiện tại:




echo $_SERVER["SCRIPT_NAME"];
// Kết quả (ví dụ): /my-web/test.php
 


$_SERVER ['HTTP_HOST'] trả về Host header từ request hiện tại:



echo $_SERVER['HTTP_HOST'];
// Kết quả (ví dụ): localhost
 


Thông tin này rất hữu ích khi bạn có nhiều hình ảnh trên máy chủ của mình và cần phải chuyển trang web sang máy chủ lưu trữ khác.


Thay vì thay đổi đường dẫn cho từng hình ảnh, bạn có thể làm như sau:


Tạo một tệp config.php, chứa đường dẫn đến hình ảnh của bạn:




<?php

$host = $_SERVER['HTTP_HOST'];
$image_path = $host.'/images/';

?>
 


Sử dụng tệp config.php trong các tập lệnh của bạn:



<?php
 
require 'config.php';
echo '<img src="'.$image_path.'header.png" />';
 
?>
 


Đến đây, đường dẫn đến hình ảnh của bạn bây giờ là động. Nó sẽ tự động thay đổi nếu bạn thay đổi Host.


Còn có rất nhiều thông tin liên quan đến SERVER mà bạn có thể khai thác thông qua biến $_SERVER (Chi tiết tham khảo tại đây)



VII.2. Form trong PHP



Trong PHP, có hai khái niệm rất quan trọng đó là $_GET và $_POST hỗ trợ trong việc thu thập dữ liệu. Tuy nhiên, để hiểu về chúng bạn cần phải hiểu về Form trước đã.


Ví dụ dưới đây cho thấy một biểu mẫu HTML đơn giản bao gồm hai trường input và một nút submit.


File index.php




<form action="welcome.php" method="post">
    <p>Tên: <input type="text" name="name" /></p>
    <p>Tuổi: <input type="text" name="age" /></p>
    <p><input type="submit" name="submit" value="Gửi" /></p>
</form>
 


Kết quả ta có form như sau:


Form trong PHP


Hãy chú ý thuộc tính action trong phần tử <form> chỉ định rằng dữ liệu sẽ được gửi đến đâu khi nhấn Gửi, trong trường hợp này nó gửi đến file welcome.php


Và các phần tử trong form HTML có thuộc tính name, nó sẽ được sử dụng khi truy cập dữ liệu bằng PHP.


Bây giờ, khi chúng ta có một biểu mẫu HTML với thuộc tính action chỉ định sau khi submit thì sẽ được chuyển hướng, xử lý ở đâu. Chúng ta có thể truy cập dữ liệu biểu mẫu đã bằng cách sử dụng mảng liên kết $_POST.


File welcome.php




<html>
<body>

Chào bạn <?php echo $_POST["name"]; ?> <br/>
Tuổi: <?php echo $_POST["age"]; ?>

</body>
</html>
 


Bây giờ, trong file index.php chúng ta thử điền tên Ngọc Anh và tuổi 18 và nhấn nút Gửi, kết quả chương trình điều hướng chúng ta đến trang welcome.php


Form trong PHP (2)



Mảng siêu cấp $_POST chứa các cặp key / value. Trong đó, keyname của trường tương ứng và value là giá trị mà người dùng nhập vào.


Vì thế, lưu ý khi viết HTML đối với các trường cần thiết bạn cần phải nhập thuộc tính name để có thể sử dụng PHP để gọi đến.



VII.3. POST trong PHP



Chúng ta có hai phương thức để gửi biểu mẫu là GETPOST.


Thông tin được gửi từ một biểu mẫu qua phương thức POST được ẩn đi, vì tất cả các name / value đều được nhúng trong nội dung của HTTP request.


Ngoài ra, không có giới hạn về số lượng thông tin được gửi.


Hơn nữa, POST hỗ trợ chức năng nâng cao như hỗ trợ đầu vào nhị phân nhiều phần trong khi tải tệp lên máy chủ.


Tuy nhiên, không thể đánh dấu trang vì các giá trị đã gửi không hiển thị.


Đối với các dữ liệu nhạy cảm, tốt nhất là sử dụng phương thức POST.



VII.4. Phương thức GET



Không giống như POST, thông tin được gửi qua biểu mẫu sử dụng phương thức GET được hiển thị cho mọi người (tất cả các tên biến và giá trị được hiển thị trong URL).


GET cũng đặt giới hạn về số lượng thông tin có thể được gửi là khoảng 2000 ký tự.


Tuy nhiên, vì các biến được hiển thị trong URL, nên có thể đánh dấu trang, điều này có thể hữu ích trong một số trường hợp.


Bây giờ, quay lại ví dụ trước, thay vì chỉ định method="post" thì chúng ta đổi thành method="get" xem sao nhé, file index.php:




<form action="welcome.php" method="get">
    <p>Tên: <input type="text" name="name" /></p>
    <p>Tuổi: <input type="text" name="age" /></p>
    <p><input type="submit" name="submit" value="Gửi" /></p>
</form>
 


Trong file welcome.php thì ta truy cập mảng siêu cấp $_GET để lấy dữ liệu:



<html>
<body>

Chào bạn <?php echo $_GET["name"]; ?> <br/>
Tuổi: <?php echo $_GET["age"]; ?>

</body>
</html>
 


Kết quả khi submit dữ liệu ta được:


Ví dụ phương thức GET trong PHP


Hãy để ý url, dữ liệu bạn gửi theo phương thức GET giờ đây được hiển thị rõ ràng.


Vì thế, đối với các dữ liệu nhạy cảm, mật khẩu thì đừng bao giờ sử dụng GET.


> Lưu ý: Đối với các trường nhận dữ liệu đầu vào từ người dùng bạn luôn phải lọc / làm sạch dữ liệu trước khi gửi về server để xử lý, tránh tin tặc lợi dụng.



VII.5. SESSION trong PHP



Session (phiên làm việc), sử dụng session giúp bạn có thể lưu trữ thông tin trong các biến, được sử dụng trên nhiều trang.


Tuy nhiên, t
heo mặc định, các biến session tồn tại cho đến khi người dùng đóng trình duyệt.


Và thông tin session không được lưu trữ trên máy tính của người dùng, giống như với cookie.


Bắt đầu một session


Một session được bắt đầu bằng cách sử dụng hàm session_start().


Sử dụng mảng siêu cấp $_SESSION của PHP để đặt các biến session.




<?php

// Bắt đầu session
session_start();

// Lưu dữ liệu session
$_SESSION["name"] = "Ngọc Anh";
$_SESSION["age"] = 18;

?>
 


> Lưu ý: Hàm session_start() phải là hàm đầu tiên trong tài liệu của bạn. Trước bất kỳ thẻ HTML nào.


Bây giờ, c
húng ta có thể sử dụng dữ liệu này trên các trang trong toàn bộ phiên.



<?php
    // Start the session
    session_start();
?>

<!DOCTYPE html>
<html>
<body>
    <?php
        echo "Chào bạn " . $_SESSION["name"];
    ?>
</body>
</html>
 


Kết quả:


Ví dụ Session trong PHP


Các biến phiên của bạn vẫn có sẵn trong mảng $_SESSION cho đến khi bạn đóng phiên của mình.


Hoặc...


Tất cả các biến session có thể được xóa theo cách thủ công bằng cách:



  • Sử dụng session_unset()
  • Hay hủy phiên bằng session_destroy()


VII.6. COOKIE trong PHP



Cookie thường được sử dụng để xác định, cá nhân hóa người dùng. Cookie là một tệp dữ liệu nhỏ mà máy chủ nhúng vào máy tính của người dùng.


Mỗi khi cùng một máy tính yêu cầu một trang thông qua trình duyệt, nó cũng sẽ gửi kèm theo cookie. Với PHP, bạn có thể vừa tạo và lấy các giá trị cookie.


Tạo cookie bằng cách sử dụng hàm setcookie():




setcookie(name, value, expire, path, domain, secure, httponly);
 


Trong đó:


  • name: Chỉ định tên cookie
  • value: Chỉ định giá trị của cookie
  • expire: Chỉ định thời gian cookie hết hạn (tính bằng giây). Giá trị: time() + 86400 * 30, sẽ đặt cookie hết hạn sau 30 ngày. Nếu tham số này bị bỏ qua hoặc được đặt thành 0, cookie sẽ hết hạn vào cuối phiên (khi trình duyệt đóng). Mặc định là 0.
  • path: Chỉ định đường dẫn máy chủ của cookie. Nếu được đặt thành '/', cookie sẽ có sẵn trong toàn trang web. Nếu được đặt thành '/php/', cookie sẽ chỉ có sẵn trong thư mục php và tất cả các thư mục con của php. Giá trị mặc định là thư mục hiện tại mà cookie đang được thiết lập.
  • domain: Chỉ định tên miền của cookie. Ví dụ, để làm cho cookie có sẵn trên tất cả các miền phụ của niithanoi.edu.vn, hãy thiết lập giá trị của tham số domain thành 'niithanoi.edu.vn'.
  • secure: Chỉ định xem cookie có chỉ được truyền qua kết nối an toàn HTTPS hay không. TRUE chỉ định rằng cookie sẽ chỉ được đặt nếu tồn tại một kết nối an toàn. Mặc định là FALSE.
  • httponly: Nếu được đặt thành TRUE, cookie sẽ chỉ có thể truy cập được thông qua giao thức HTTP (cookie sẽ không thể truy cập được đối với các ngôn ngữ kịch bản). Sử dụng httponly giúp giảm hành vi trộm cắp danh tính bằng cách sử dụng các cuộc tấn công XSS. Mặc định là FALSE.


> Lưu ý: Tham số name là bắt buộc. Các tham số khác là tùy chọn



Ví dụ thiết lập cookie có tên là 'user', với giá trị là 'Ngọc Anh'. Cookie hết hạn sau 30 ngày và có sẵn tên toàn bộ website:



<?php

$value = "Ngọc Anh";

// Thiết lập cookie
setcookie("user"$valuetime() + (86400 * 30), '/');

?>
 


Bây giờ, chúng ta có thể sử dụng dữ liệu từ cookie bằng cách truy cập mảng $_COOKIE:



<?php
    $value = "Ngọc Anh";
    // Thiết lập cookie
    setcookie("user"$valuetime() + (86400 * 30), '/');
?>
 
<!DOCTYPE html>
<html>
<body>
    <?php
        if(isset($_COOKIE['user'])) {
            // Truy cập value của cookie
            echo "Tên người dùng: "$_COOKIE['user'];
        }
    ?>
</body>
</html>
 


Để tránh lỗi, chúng ta sử dụng hàm isset() để kiểm tra xem cookie có tồn tại hay không, sau đó mới lấy dữ liệu.


> Lưu ý: Hàm setcookie() phải được thiết lập trước bất kỳ thẻ HTML nào.


Giá trị của cookie được mã hóa tự động khi cookie được gửi đi và tự động được giải mã khi nhận được. Tuy nhiên, ĐỪNG BAO GIỜ lưu trữ thông tin nhạy cảm trong cookie.



VIII. LÀM VIỆC VỚI FILE TRONG PHP



Làm việc với file là một trong những công việc phổ biến nhất trong lập trình, vì vậy PHP cung cấp cho chúng ta các phương thức hỗ trợ Create, Read, Upload và Edit file.


VIII.1. Ghi vào một file



Hàm fopen() cho phép tạo hoặc mở một tệp. Nếu bạn sử dụng fopen() với một tệp không tồn tại, tệp sẽ được tạo, cho rằng tệp đã được mở để ghi (w) hoặc thêm (a).


Ví dụ: Mở tệp file.txt để ghi. Xóa nội dung của tệp cũ để ghi hoặc tạo tệp mới nếu chưa tồn tại.




$myfile = fopen("file.txt""w");
 


Sử dụng một trong các chế độ sau để mở tệp:


  • r: Mở tệp để chỉ đọc.
  • w: Chỉ mở tệp để ghi. Xóa nội dung của tệp hoặc tạo tệp mới nếu nó không tồn tại.
  • a: Mở tệp chỉ để ghi. Tạo tệp mới nếu tệp không tồn tại
  • x: Tạo tệp mới chỉ để ghi.
  • r+: Mở tệp để đọc / ghi.
  • w+: Mở tệp để đọc / ghi. Xóa nội dung của tệp hoặc tạo tệp mới nếu nó không tồn tại.
  • a+: Mở tệp để đọc / ghi. Tạo tệp mới nếu tệp không tồn tại
  • x+: Tạo tệp mới để đọc / ghi.


Khi bạn đã có mở được file và cho phép ghi, bạn có thể sử dụng hàm fwrite() để ghi nội dung vào file đó.


Ví dụ dưới đây ghi một vài tên vào một tệp mới có tên 'sinh-vien.txt'.




// Mở file và cho phép ghi
$myfile = fopen("sinh-vien.txt""w");

// Viết vào file vừa mở
$txt = "Ngọc Anh\n";
fwrite($myfile$txt);

$txt = "Vũ Hà\n";
fwrite($myfile$txt);

// Đóng file
fclose($myfile);
 


Ký hiệu \n được sử dụng khi viết các dòng mới.


Kết quả, vào thư mục dự án ta thấy có một file mới với nội dung như thế này:


Ví dụ thao tác với file trong PHP (1)


> Lưu ý: Để giảm thiểu các vấn đề về bảo mật, luôn luôn đóng file bằng fclose() sau khi thao tác xong. fclose() trả về TRUE nếu thành công hoặc FALSE nếu thất bại


VIII.2. Thêm vào một file



Nếu bạn muốn nối nội dung vào một tệp (đã có dữ liệu sẵn), bạn cần mở tệp đó ở chế độ append.


Ví dụ:




// Mở file và cho phép ghi
$myfile = fopen("sinh-vien.txt""a");

// Thêm dữ liệu vào file vừa mở
$txt = "Thu Hương\n";
fwrite($myfile$txt);

// Đóng file
fclose($myfile);
 


Bây giờ, sau khi chạy chương trình ta mở lại file sinh-vien.txt lên, kết quả được như sau:


Thao tác với file trong PHP (2)


Về cơ bản, khi thêm vào một tệp bằng chế độ 'a', con trỏ tệp được đặt ở cuối tệp, đảm bảo rằng tất cả dữ liệu mới được thêm vào cuối tệp.


Hãy thử làm một ví dụ thực tế lấy dữ liệu từ form và lưu vào file contact.txt:


Tạo file contact.php và viết code như sau:




<?php
    // Kiểm tra nếu tồn tại dữ liệu thì lưu vào file
    if(isset($_POST['email'])) {

        // Lấy email và khách hàng nhập
        $email = $_POST['email'];

        // Mở file để ghi
        $handle = fopen('contact.txt''a');

        // Thêm email vào cuối file
        fwrite($handle$email."\n");

        // Đóng file
        fclose($handle);
    }
?>
 
<form method="post">
  Email: <input type="text" name="email" />
  <input type="submit" name="submit" value="Đăng ký liên hệ" />
</form>
 


Chạy file contact.php trên trình duyệt, điền email và nhấn Đăng ký liên hệ:


Ví dụ thao tác với file trong PHP (3)


Kết quả, mở thư mục dự án ta thấy có một file mới tên là contact.txt được tạo ra, với nội dung như sau:


Ví dụ thao tác với file trong PHP (4)


 

VIII.3. Đọc file trong PHP



Hàm file() đọc toàn bộ tệp thành một mảng. Mỗi phần tử trong mảng tương ứng với một dòng trong tệp.


Ví dụ: Đọc file sinh-vien.txt và in ra màn hình


File read-file.php




// Đọc file và gán mảng trả về
// cho biến $read
$read = file('sinh-vien.txt');

// Lặp qua từng phần tử của mảng và nối
// từng phần tử lại với nhau
foreach ($read as $line) {
    echo $line . ", ";
}
 


Kết quả ta được:


Ví dụ đọc file trong PHP (1)


Trong ví dụ này chúng ta thấy ở cuối còn có 1 dấu phẩy bị thừa. Để kết quả đẹp hơn, chúng ta sẽ chỉ in dấu phẩy ở các hàng trước, trừ hàng cuối cùng:


File read-file.php




// Đọc file và gán mảng trả về
// cho biến $read
$read = file('sinh-vien.txt');

// Tính số phần tử của mảng
$count = count($read);

$i = 1;
// Lặp qua từng phần tử của mảng và nối
// từng phần tử lại với nhau
foreach ($read as $line) {
    
    echo $line;

    // Thêm phân tách mỗi phần tử
    // trừ phần tử cuối
    if ($i < $count) {
        echo ", ";
    }
    $i++;
}
 


Kết quả ta được:


Ví dụ đọc file trong PHP (2)


Như vậy, trong phần này bạn đã biết cơ bản về cách thao tác đọc file, ghi file với PHP. Tuy nhiên, còn có rất nhiều vấn đề trong thao tác với file mà mình không thể đi sâu hết, bạn hãy tự tìm hiểu thêm nhé.


IX. LẬP TRÌNH HƯỚNG ĐỐI TƯỢNG (OOP) VỚI PHP



Lập trình hướng đối tượng (OOP - Object Oriented Programming) là một phương pháp lập trình nhằm làm cho lập trình giống với thế giới thực hơn, mô hình hóa đối tượng thực tế vào trong máy tính.


Các đối tượng (Object) được tạo bằng cách sử dụng các lớp (Class), là trọng tâm trong phương pháp OOP.


Lớp mô tả đối tượng sẽ là gì, nhưng tách biệt với chính đối tượng.



IX.1. Class trong PHP



Một lớp (Class) trong PHP được coi là bản thiết kế (blueprint), mô tả hoặc định nghĩa của một đối tượng.


Hãy xem các ví dụ minh họa sau:



Class và Object trong PHP



Như bạn thấy, lớp là một bản thiết kế, từ lớp đó, ta có thể tạo ra các đối tượng khác nhau với các thuộc tính, phương thức khác nhau.


Trong PHP, một lớp có thể bao gồm các biến thành viên được gọi là thuộc tính (properties) để xác định các thuộc tính của một đối tượng và các hàm, trong lớp thì gọi là phương thức (methods), để xác định hành vi của một đối tượng.


Định nghĩa lớp bắt đầu bằng từ khóa class, theo sau là tên lớp. Dấu ngoặc nhọn { } bao quanh các thuộc tính và phương thức thuộc lớp.


 


// Ví dụ tạo class trong PHP
class SinhVien {

    public $ten// Thuộc tính
    public $tuoi// Thuộc tính

    public function hocBai () { // Phương thức
        echo "Đang học bài...";
    }
}
 



Quy tắc đặt tên lớp:

 

  • Tên của lớp có thể bắt đầu bằng một chữ cái hoặc một dấu gạch dưới _
  • Theo sau là chữ cái, số hoặc dấu gạch dưới.
  • Best Pratice: Thông thường tên lớp được viết theo kiểu PascalCase (Các từ liền nhau, chữ cái đầu viết HOA)



Chú ý từ khóa public ở phía trước của phương thức hocBai() nó là một chỉ định phạm vi hiển thị.


Từ khóa public chỉ định rằng thành viên có thể được truy cập từ bất kỳ đâu trong chương trình.


> Note: Có những từ khóa chỉ định phạm vi truy cập (hiển thị) khác và chúng ta sẽ tìm hiểu về chúng trong phần sau.



Như vậy, thông qua lớp, chúng ta đã tạo được bản thiết kế. Bây giờ, để tạo được đối tượng thì chúng ta tiếp tục đi sang phần tiếp theo...

 

IX.2. Object trong PHP



Quá trình tạo một đối tượng của một lớp được gọi là khởi tạo.


Để khởi tạo một đối tượng của một lớp, hãy sử dụng từ khóa new, như trong ví dụ dưới đây:




$sv1 = new SinhVien();
 


Trong đoạn mã trên, $sv1 là một đối tượng của lớp SinhVien.


Để truy cập các thuộc tính và phương thức của một đối tượng, hãy sử dụng ký hiệu mũi tên ->, như trong ví dụ sau:




echo $sv1 -> ten;
 


Câu lệnh này xuất ra giá trị của thuộc tính ten cho $sv1. Nếu bạn muốn gán giá trị cho một thuộc tính, hãy sử dụng toán tử gán = như cách bạn gán giá trị cho biến.


Ví dụ: Ta điều chỉnh lại ví dụ trên như sau:




// Ví dụ tạo class trong PHP
class SinhVien {

    public $ten// Thuộc tính
    public $tuoi// Thuộc tính

    public function hocBai () { // Phương thức
        echo $this -> ten . " đang học bài...";
    }
}

// Tạo đối tượng mới
$sv1 = new SinhVien();

// Gán giá trị cho thuộc tính
// của đối tượng sv1
$sv1 -> ten = "Ngọc Anh";

// Truy cập thuộc tính
echo $sv1 -> ten;

echo "<br/>";

// Gọi phương thức
$sv1 -> hocBai();
 


Kết quả:



Ngọc Anh
Ngọc Anh đang học bài
 


Bạn thấy từ $this là lạ đúng không?


Ở đây $this là một biến giả là một tham chiếu đến đối tượng đang gọi.


Khi làm việc bên trong một phương thức, hãy sử dụng $this giống như cách bạn sử dụng tên đối tượng bên ngoài lớp.


Ví dụ:




// Ví dụ tạo class trong PHP
class SinhVien {

    public $ten// Thuộc tính
    public $tuoi// Thuộc tính

    public function hocBai () { // Phương thức
        echo $this -> ten . " đang học bài...";
    }
}

// Tạo 2 đối tượng mới
$sv1 = new SinhVien();
$sv2 = new SinhVien();

// Gán tên cho các sinh viên
$sv1 -> ten = "Ngọc Anh";
$sv2 -> ten = "Vũ Hà";

// Gọi phương thức của $sv1
$sv1 -> hocBai();

echo "<br/>";

// Gọi phương thức của $sv2
$sv2 -> hocBai();
 


Kết quả:



Ngọc Anh đang học bài...
Vũ Hà đang học bài...
 


Như bạn thấy đó, $this tham chiếu đến đối tượng đang gọi, chính vì thế gọi từ đối tượng $sv1$sv2 sẽ cho kết quả khác nhau.


Điều này cũng cho chúng ta thấy rằng, các đối tượng khác nhau sẽ có giá trị thuộc tính khác nhau.



IX.3. Constructor và Destructor



PHP cung cấp cho chúng ta một phương thức sử dụng để khởi tạo các giá trị ban đầu cho lớp, đó là __construct().


Phương thức __construct() được gọi tự động bất cứ khi nào một đối tượng mới được khởi tạo.


> Lưu ý: __construct() bắt đầu bằng hai dấu gạch dưới


File constructor.php




// Ví dụ
class SinhVien {
    // Phương thưc khởi tạo
    public function __construct () {
        echo "Đã tạo đối tượng mới";
    }
}

$sv1 = new SinhVien();
 


Kết quả khi chạy chương trình trên ta được:



Đã tạo đối tượng mới
 


Thông thường, phương thức __construct() được sử dụng để khởi tạo giá trị ban đầu mà đối tượng cần. Nó chấp nhận các tham số để nhận các giá trị khi khởi tạo đối tượng.


Ví dụ:




class SinhVien {

    public $ten;
    public $tuoi;

    // Phương thức khởi tạo
    public function __construct ($ten$tuoi) {
        $this -> ten = $ten;
        $this -> tuoi = $tuoi;
    }
}

// Khởi tạo đối tượng
$sv1 = new SinhVien("Ngọc Anh"18);
$sv2 = new SinhVien("Vũ Hà"19);

// Truy cập tên, tuổi của từng sinh viên
echo $sv1 -> ten . " " . $sv1 -> tuoi . " tuổi";

echo "<br />";

echo $sv2 -> ten . " " . $sv2 -> tuoi . " tuổi";
 


Kết quả:



Ngọc Anh 18 tuổi
Vũ Hà 19 tuổi
 


Bạn lưu ý câu lệnh khởi tạo đối tượng mới này:



// Khởi tạo đối tượng
$sv1 = new SinhVien("Ngọc Anh"18);
 


Lúc này, phương thức khởi tạo sẽ nhận các giá trị để khởi tạo các giá trị tương ứng.


> Lưu ý: Bạn không thể tạo nhiều phương thức __contruct() với các số lượng tham số khác nhau giống như constructor trong Java.


Ngược lại với constructor, phương thức destructor là phương thức tự động được gọi khi đối tượng bị hủy.




// Ví dụ
class SinhVien {

    // Phương thức destructor
    public function __destruct() {
        echo "Đối tượng đã bị hủy";
    }
}

// Khởi tạo đối tượng
$sv1 = new SinhVien();
 


Kết quả:



Đối tượng đã bị hủy
 


Tập lệnh này tạo một đối tượng SinhVien mới là $sv1. Khi tập lệnh kết thúc, đối tượng sẽ tự động bị phá hủy, nó gọi hàm hủy và xuất ra thông báo.


Bạn cũng có thể kích hoạt trình hủy một cách rõ ràng, bạn có thể hủy đối tượng bằng cách sử dụng hàm unset() trong một câu lệnh tương tự như:




// Chủ động hủy đối tượng
unset($sv1);
 


Destructor rất hữu ích để thực hiện các tác vụ nhất định khi đối tượng kết thúc vòng đời của nó.


Ví dụ: Giải phóng tài nguyên, log file, đóng kết nối cơ sở dữ liệu, v.v.


Theo mặc định, PHP sẽ giải phóng tất cả các tài nguyên khi một tập lệnh kết thúc quá trình thực thi của nó.



IX.3. Kế thừa lớp trong PHP



Các lớp có thể kế thừa các phương thức và thuộc tính của một lớp khác.


Lớp kế thừa các phương thức và thuộc tính được gọi là lớp con (sub-class). Lớp cho kế thừa và lớp cha (parent-class).


Để đạt được kế thừa, chúng ta sử dụng từ khóa extends



Ví dụ: Chúng ta tạo lớp cha la Cho kế thừa từ lớp DongVat và thử gọi phương thức của lớp DongVat (lớp cha)


File inheritance.php




// Class cha
class DongVat {
    public $ten;
    public function an() {
        echo "Đang ăn...";
    }
}

// Class con
class Cho extends DongVat {
    //
}

// Khởi tạo đối tượng từ class con
$milu = new Cho();

// Gọi phương thức an()
$milu -> an();
 


Kết quả:



Đang ăn...
 


Như vậy, lớp Cho (lớp con) đã kế thừa thành công từ lớp DongVat (lớp cha).


Phương thức khởi tạo cha là không được gọi ngầm nếu lớp con định nghĩa một phương thức khởi tạo riêng.


Tuy nhiên, nếu con không định nghĩa một phương thức khởi tạo thì nó sẽ được kế thừa từ lớp cha nếu nó không được khai báo là private


> Lưu ý: Để tăng thêm kiểm soát đối tượng, bạn có thể chỉ định các từ khóa chỉ định mức độ truy cập.


Mức độ truy cập cũng như khả năng hiển thị (visibility), các phương thức, thuộc tính hiển thị đến đầu thì được truy cập đến đó.


Cho đến lúc này, chúng ta đã sử dụng từ khóa public để chỉ định rằng một thuộc tính / phương thức có thể truy cập từ bất kỳ đâu.


Ngoài ra, PHP còn hỗ trợ hai từ khóa khác để khai báo khả năng hiển thị:



  • protected: Chỉ định các thành viên (của lớp cha) có thể được truy cập ở một lớp con thông qua kế thừa
  • private: Chị định rằng các thành viên chỉ có thể truy cập ở lớp mà nó được khai báo


Thuộc tính lớp phải luôn phải được chỉ định mức độ hiển thị (truy cập).


Nhưng các phương thức lại không bắt buộc.


Tuy nhiên, phương thức không được chỉ định public / protected hay private thì mặc định sẽ là public.


Trong kế thừa chúng ta có một khái niệm rất quan trọng, đó là Interface.


Một Interface chỉ định danh sách các phương thức mà một lớp phải triển khai.


Tuy nhiên, bản thân interface không triển khai cụ thể phương thức nào (chỉ có tên và mức độ truy cập phải là public).


Đây là một khía cạnh quan trọng của Interface vì nó cho phép một phương thức được xử lý khác nhau trong mỗi lớp sử dụng giao diện.



  • Từ khóa interface sử dụng để định nghĩa một Interface.
  • Từ khóa implements được sử dụng trong một lớp để triển khai một Interface.


Ví dụ: Interface IDongVat định nghĩa phương thức an() nhưng không có triển khai cụ thể.


File interface.php




// Interface
interface IDongVat {
    public function an();
}
 


Các phương thức của Interface chỉ được triển khai cụ thể khi có class triển khai Interface đó.


Lưu ý là phương thức an() của interface không có dấu ngoặc nhọn { }


Ví dụ: Ta tiếp tục tạo hai lớp ChoMeo để triển khai Interface IDongVat



File interface.php



// Interface
interface IDongVat {
    public function an();
}

class Cho implements IDongVat {
    // Triển khai cụ thể phương thức của interface
    public function an() {
        echo "Đang gặm xương <br/>";
    }
}

class Meo implements IDongVat {
    // Triển khai cụ thể phương thức của interface
    public function an() {
        echo "Đang ăn cá <br/>";
    }
}

// Tạo đối tượng từ lớp Cho
$milu = new Cho();
// Gọi phương thức an()
$milu -> an();

// Tạo đối tượng từ lớp Meo
$mimi = new Meo();
// Gọi phương thức an()
$mimi -> an();
 


Kết quả:



Đang gặm xương
Đang ăn cá
 


> Lưu ý: Class triển khai một interface bắt buộc phải triển khai cụ thể cho các phương thức của interface hoặc biến nó thành phương thức trừu tượng


Trong PHP, một lớp có thể triển khai nhiều interface, ví dụ:




// Triển khai nhiều interface
class MeoNha implements IDongVatIMeoRungIHoIBao {
    // Các phương thức của interface phải được
    // triển khai cụ thể (hoặc biến thành abstract)
    // ở đây
}
 


Ngoài việc kế thừa từ lớp, Interface như thông thường, chúng ta còn có thể kế thừa từ lớp trừu tượng (hay còn gọi là abstract class).


Trong đó:



  • Các lớp trừu tượng có thể được kế thừa nhưng chúng không thể được khởi tạo.
  • Chúng mang lại lợi thế là có thể chứa cả hai phương thức đã được triển khai cụ thể và phương thức trừu tượng chưa được triển khai.
  • Một lớp kế thừa từ một lớp trừu tượng phải triển khai tất cả các phương thức trừu tượng.
  • Và, từ khóa abstract được sử dụng để tạo một lớp trừu tượng hoặc một phương thức trừu tượng.


File abstract.php



// Lớp trừu tượng
abstract class Cho {
    private $mauLong;

    // Phương thức trừu tượng
    abstract public function an();

    // Phương thức thiết lập màu lông cho chó
    public function setMauLong($mauSac) {
        $this -> mauLong = $mauSac;
    }
    // Phương thức lấy màu lông
    public function getMauLong() {
        return $this -> mauLong;
    }
}

// Kế thừa lớp trừu tượng
class ChoCo extends Cho {
    public function an() {
        echo "Ăn cơm chan canh";
    }
}

// Khởi tạo đối tượng mới từ class ChoCo
$cauVang = new ChoCo();

// Thiết lập màu lông
$cauVang -> setMauLong("Vàng");

// In ra màu lông
echo $cauVang -> getMauLong();
echo "<br/>";

// Gọi phương thức an()
$cauVang -> an();
 


Kết quả khi chạy chương trình ta được:



Vàng
Ăn cơm chan canh
 


> Lưu ý: Các phương thức trừu tượng chỉ có thể xuất hiện trong lớp trừu tượng.


IX.4. Từ khóa stactic và final trong PHP



Từ khóa static trong PHP định nghĩa các thuộc tính static và phương thức static.


Một thuộc tính / phương thức static của một lớp có thể được truy cập mà không cần tạo một đối tượng của lớp đó.


Một thuộc tính hoặc phương thức static được truy cập bằng cách sử dụng toán tử phân giải phạm vi :: giữa tên lớp và tên thuộc tính / phương thức.


File static.php




class SinhVien {
    // Thuộc tính static
    static $tuoi = 18;
}

// Truy cập thuộc tính static
// mà không cần tạo đối tượng
echo SinhVien::$tuoiToiThieu;
 


Kết quả:



18
 


Để truy cập thuộc tính static trong một phương thức static, chúng ta sử dụng từ khóa self, như sau:


File static-method.php




class SinhVien {

    // Thuộc tính static
    static $tuoiToiThieu = 18;

    // Phương thức static
    static function thongBao() {
        // Truy cập thuộc tính static
        // trong phương thức static
        echo self::$tuoiToiThieu;
    }
}

// Gọi phương thức static
// mà không cần tạo đối tượng
SinhVien::thongBao();
 


Kết quả chạy chương trình ta được:



18
 


Như vậy, chúng ta đã truy cập phương thức static thành công mà không cần tạo đối tượng từ class SinhVien.


> Lưu ý: Đối tượng của lớp không thể truy cập thuộc tính static. Tuy nhiên, nó có thể truy cập phương thức static.


Từ khóa finnal trong PHP định nghĩa các phương thức không thể bị ghi đè trong các lớp con. Các lớp được định nghĩa là final cũng không thể được kế thừa.


Ví dụ sau đây chứng minh rằng một phương thức final là không thể bị ghi đè trong lớp con:


File final.php




class SinhVien {
    // Phương thức final
    final function thongBao () {
        echo "Đây là một sinh viên";
    }
}

class SinhVienNamNhat extends SinhVien {
    // Chương trình sẽ ném ra một lỗi nghiêm trọng
    // nếu cố gắng ghi đè phương thức static
    public function thongBao () {
        echo "Đây là một sinh viên năm nhất";
    }
}
 


Chạy chương trình trên, PHP sẽ ném ra một lỗi nghiêm trọng. Không tin thì bạn thử xem!



// Lớp final
final class SinhVien {}

// Cố gắng kế thừa lớp final sẽ thất bại
class SinhVienNamNhat extends SinhVien {}
 


Bởi vì, final là ý nghĩa rằng đây là bản cuối cùng không thể sửa đổi.


> Lưu ý: Có một điểm đặc biệt, trong PHP các thuộc tính không thể được đánh dấu là final



TỔNG KẾT TỰ HỌC LẬP TRÌNH PHP



Như vậy, trong bài hướng dẫn tự học Lập trình PHP cơ bản này mình đã giúp bạn tìm hiểu về những khái niệm quan trọng và căn bản nhất của ngôn ngữ PHP.


Điểm đặc biệt ở series này không phải giúp bạn làm chủ ngôn ngữ PHP mà là giúp bạn làm quen với ngôn ngữ này và thoải mái khi tiếp tục học sâu hơn, học lập trình web với PHP.


Nếu bạn chịu khó code lại mỗi ví dụ ít nhất 1, 2 lần thì mình tin chắc là nền tảng PHP của bạn cũng khá ổn.


Giờ đây bạn hoàn toàn có đủ kiến thức, tự tin để tham dự các KHÓA HỌC PHP chuyên sâu ở các trung tâm đào tạo lập trình hay các khóa học Online trên Udemy, Coursera, Edumall...


 
Nếu bạn muốn học PHP chuyên sâu với chuyên gia doanh nghiệp thì...


LIÊN HỆ TƯ VẤN NGAY!


Chúc bạn thành công với ngôn ngữ PHP này!


---

HỌC VIỆN ĐÀO TẠO CNTT NIIT - ICT HÀ NỘI
Học Lập trình chất lượng cao (Since 2002). Học thực tế + Tuyển dụng ngay!
Đc: Tầng 3, 25T2, N05, Nguyễn Thị Thập, Cầu Giấy, Hà Nội
SĐT: 02435574074 - 0383.180086
Email: hello@niithanoi.edu.vn
Fanpage: https://facebook.com/NIIT.ICT/
 
#niit #icthanoi #niithanoi #niiticthanoi #hoclaptrinh #khoahoclaptrinh #hoclaptrinhjava #hoclaptrinhphp #java #php #python
 
Bình luận Facebook
Khóa học liên quan đến bài viết

KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS

56 giờ
Học Lập trình Front end hiện đại với ReactJS. Học làm chủ HTML, CSS, JS và thư viện JavaScript phổ biến nhất hiện nay. Sẵn sàng đi thực tập / đi làm ngay sau khóa học.

Khóa học PHP Full stack [2023] cho người mới bắt đầu

96 giờ
Khóa học Lập trình PHP Full stack, phiên bản cập nhật lần thứ 8. Dạy Lập trình PHP bài bản từ Front end đến Back end + Laravel. Hướng dẫn làm 2 Dự Án Web lớn

KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG

50 giờ
Khóa học giúp học viên sử dụng thành thạo ngôn ngữ Lập trình Python (3x). Hiểu và phát triển được Ứng dụng Web với Django Framework. Học thực hành với Giảng viên cao cấp.

Lập trình PHP với Laravel Framework

42 giờ
Khóa học Lập trình PHP với Laravel Framework được NIIT - ICT HÀ NỘI xây dựng nhằm hoàn thiện kỹ năng lập trình web các các bạn đã biết Lập trình Web PHP thuần.

Khóa học Java Full stack (IJFD)

104 giờ
Học lập trình Java Fullstack với khóa học được xây dựng theo lộ trình bài bản, từ JAVA CƠ BẢN đến JAVA WEB và nâng cao về JAVA FRAMEWORK như: Spring Boot, Hibernate
Mục lục
Đăng ký tư vấn
Nhân viên gọi điện tư vấn miễn phí sau khi đăng ký
Được cập nhật các ưu đãi sớm nhất
Hotline: 0383180086
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Hãy đăng ký để nhận những thông tin mới nhất về học bổng mới nhất tại NIIT - ICT Hà Nội
top
Đóng lại Đăng ký học tại NIIT - ICT Hà Nội
6260+ học viên đã theo học tại NIIT - ICT Hà Nội và có việc làm tốt trong ngành lập trình. Nắm lấy cơ hội ngay hôm nay!
Chọn khóa học
  • KHÓA HỌC LẬP TRÌNH FRONT END VỚI REACT.JS
  • KHÓA HỌC LẬP TRÌNH PHP WEB
  • Khóa học PHP Full stack [2023] cho người mới bắt đầu
  • Khóa học BIG DATA với Hadoop và Spark
  • Khóa học Lập trình Android tại Hà Nội
  • [Tuyển sinh 2023] Lập trình viên Quốc tế DigiNxt
  • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại Hà Nội
  • LẬP TRÌNH GAME
    • Khóa học Lập trình Game Unity
  • LẬP TRÌNH WEB FRONT END
    • KHÓA HỌC PYTHON HƯỚNG ĐỐI TƯỢNG
    • KHÓA HỌC ANGULAR & TYPESCRIPT (FRONT END)
  • LẬP TRÌNH WEB BACK END
    • LẬP TRÌNH JAVA WEB VỚI FRAME WORK
    • Lập trình Web với Django
    • Lập trình PHP với Laravel Framework
  • CHƯƠNG TRÌNH ĐÀO TẠO ỨNG DỤNG CÔNG NGHỆ
    • Khóa học Tiền lương & Phúc lợi (C&B Excel) tại TP HCM
  • LẬP TRÌNH WEB FULL STACK
    • Khóa học Java Full stack (IJFD)
  • LẬP TRÌNH MOBILE
    • FRONT-END VỚI REACTJS VÀ REACT NATIVE
    • Lập trình Android Nâng cao
  • ĐÀO TẠO CHO DOANH NGHIỆP
    • KHÓA HỌC BUSINESS ANALYSIC TỪ CƠ BẢN ĐẾN NÂNG CAO 2023
    • Khóa học Magento: Làm chủ CMS TMĐT lớn nhất
    • Khóa học IOT: Xây dựng Sản phẩm IOT với Raspberry Pi
    • Khóa học Automation Testing Chuyên nghiệp
  • KHÓA HỌC DỰ ÁN
    • Học sử dụng bộ Office: Word, Excel, Power Point, Mail chuyên nghiệp
  • KHÓA HỌC KHÁC
    • VBA Excel Toàn Tập (Cơ Bản - Nâng Cao)
    • VBA Excel Nâng cao
    • Khóa học JMeter: Performance Testing
    • Khóa học Tester đạt chuẩn Quốc tế ISTQB Foundation Level
    • Khoá Học Tester đạt chuẩn quốc tế ISTQB Advanced Level
Bạn chưa chọn khóa học cần đăng ký
Tên không được để trống
Số điện thoại không được để trống
Email không được để trống
Đăng ký học thành công!
Cảm ơn bạn đã đăng ký học tại NIIT - ICT HÀ NỘI!