Hướng dẫn Từng bước học lập trình PHP nâng cao qua dự án website giới thiệu sản phẩm

#1
Sau loạt bài hướng dẫn "Từng bước học lập trình PHP cơ bản qua dự án website giới thiệu sản phẩm" tôi sẽ tiếp tục viết loạt bài hướng dẫn các bạn học lập trình PHP nâng cao thông qua việc hoàn thành dự án website giới thiệu sản phẩm (Tương tự như ở loạt bài cơ bản).

Từng bước hoàn thành dự án website giới thiệu sản phẩm (Trang quản trị và trang người dùng) các bạn sẽ được học các vấn đề liên quan tới lập trình PHP nâng cao (Lập trình hướng đối tượng).

Các bạn lưu ý, bài hướng dẫn này tôi chỉ trình bày và giải thích các vấn đề nâng cao trong lập trình PHP. Các vấn đề tôi đã trình bày, giải thích ở loạt bài cơ bản rồi thì tôi sẽ không trình bày hay giải thích cho các bạn nữa. Và tôi cũng khuyên các bạn nên tìm hiểu, nghiên cứu thật kỹ phần cơ bản trước khi tìm hiểu phần nâng cao này.

Chân thành cảm ơn sự quan tâm của các bạn!
 
#2
PHẦN 1: THÔNG TIN CẤU HÌNH WEBSITE

Về cấu trúc thư mục, cấu trúc DB và các chức năng của website tương tự như ở loạt bài hướng dẫn "Từng bước học lập trình PHP cơ bản qua dự án website giới thiệu sản phẩm".

Nội dung kiến thức phần này gồm:
  • Lớp (Class).
  • Hằng (Constant).
Trong thư mục configs, tạo mới tập tin Config.php để khai báo các thông tin cấu hình website. Bạn lưu ý tập tin Config.php tôi viết hoa chữ "C". Chuẩn đặt tên tập tin, lớp, hàm, biến... các bạn lưu ý các nội dung hướng dẫn của tôi.

Nội dung tập tin configs/Config.php như sau:
PHP:
<?php
class Config
{
    //Thông tin website
    const SITE_URL = 'http://localhost/';
    const BASE_PATH = 'C:\Wamp\www\\';

    //Thông tin cấu hình DB
    const DB_SERVER = 'localhost';
    const DB_USERNAME = 'root';
    const DB_PASSWORD = '';
    const DB_DATABASE = 'training_php_02';
}
?>
1. Lớp (Class):

Lớp các bạn có thể hiểu như một bản thiết kế (Hay khuôn mẫu) của một đối tượng nào đó với các thuộc tính, trạng thái, hành động... theo mục đích của người lập trình.

Bên trong một lớp có các thành phần:
  • Thuộc tính (Property): Mô tả thuộc tính của đối tượng. Thuộc tính của một lớp bao gồm các biến, các hằng, hay tham số nội tại của lớp đó. Ở đây, vai trò quan trọng nhất của các thuộc tính là các biến vì chúng có thể bị thay đổi trong suốt quá trình hoạt động của một đối tượng. Các thuộc tính có thể được xác định kiểu và kiểu của chúng có thể là các kiểu dữ liệu cổ điển hay đó là một lớp đã định nghĩa từ trước.
  • Phương thức (Method): Mô tả một hành vi nào đó của đối tượng (Hoặc của lớp). Phương thức thực chất như một hàm bên trong một lớp.
Ví dụ:

Lớp "Người" dùng để chỉ những thực thể sống trên trái đất với các thuộc tính là "chân, tay, mắt, mũi..." và có những hành vi như "đi, đứng, nằm...".

Để tạo ra một lớp, các bạn thực hiện theo mẫu sau:
Mã:
class Tên_lớp
{
    //Nội dung của lớp
}
Ví dụ:
PHP:
class Person
{}
Các bạn lưu ý khi đặt tên lớp:

  • Tên lớp trùng với tên tập tin PHP (Vì vậy tên tập tin PHP cũng phải tuân thủ quy tắc đặt tên của lớp).
  • Nếu tên lớp có từ hai từ trở lên thì phải viết hoa đầu từ và có thể viết liền nhau hoặc sử dụng dấu gạch dưới "_" để phân cách (Ví dụ: Person, UserProfile hoặc User_Profile).
Liên quan tới lớp còn có khái niệm đối tượng (Object), thuộc tính, phương thức.. tôi sẽ trình bày sau.

Các bạn có thể tìm hiểu thêm về lớp tại địa chỉ
Bạn phải đăng nhập để xem liên kết Log in or register now.
.

2. Hằng (Constant):

Hằng là gì thì tôi đã trình bày ở loạt bài hướng dẫn "cơ bản". Ở phần này thì tôi chỉ trình bày cho các bạn biết cách khai báo, sử dụng hằng trong một lớp.

Tập tin configs/Config.php, tôi đã khai báo 6 hằng (SITE_URL, BASE_PATH, DB_SERVER, DB_USERNAME, DB_PASSWORD, DB_DATABASE). Như vậy, để khai báo hằng trong một lớp các bạn thực hiện theo mẫu sau:
Mã:
const Tên_hằng = Giá_trị_của_hằng;
Ví dụ:
PHP:
const SITE_URL = 'http://localhost/';
Các bạn có thể tìm hiểu thêm về hằng tại địa chỉ
Bạn phải đăng nhập để xem liên kết Log in or register now.
.
 
#6
PHẦN 2: KẾT NỐI CƠ SỞ DỮ LIỆU

Nội dung kiến thức phần này gồm:
  • Thuộc tính (Property).
  • Phương thức (Method).
  • Kế thừa (Extends).
Trong thư mục libraries, các bạn tạo mới 2 tập tin MySql.php và Db.php để viết mã lệnh kết nối DB.

Nội dung tập tin libraries/MySql.php như sau:
PHP:
<?php
class MySql
{
    protected $connection;
    protected $query;
 
    public function __construct()
    {
        //Kết nối DB
        $this->connection = mysqli_connect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD, Config::DB_DATABASE) or die('Not connected DB!');
     
        //Yêu cầu lưu trữ UTF8 (Tiếng Việt)
        mysqli_query('SET NAMES UTF8', $this->connection);
    }
 
    public function query($sql)
    {
        //Truy vấn
        return $this->query = mysqli_query($this->connection, $sql);
    }
 
    public function fetch()
    {
        //Lấy dữ liệu
        return mysqli_fetch_assoc($this->query);
    }
}
?>
Nội dung tập tin libraries/Db.php như sau:
PHP:
<?php
require Config::BASE_PATH . 'libraries/MySql.php';

class Db extends MySql
{}
?>
Như các bạn thấy, toàn bộ các câu lệnh kết nối tới DB đều nằm ở lớp MySql được viết trong tập tin libraries/MySql.php. Vậy lớp Db được viết trong tập tin libraries/Db.php có vai trò gì khi mà lớp Db này chỉ mở rộng (Extends) từ lớp MySql chứ không có thêm thuộc tính hay phương thức nào mới? Lớp Db này có một vai
trò quan trọng mà các bạn nên tìm hiểu thêm.

Các bạn lưu ý tới 2 phương thức query và fetch của lớp MySql. Trong đó:
  • Phương thức query dùng để thực thi câu lệnh
    SQL và gán kết quả vào thuộc tính $query để sử dụng ở phương thức fetch
    (Trong trường hợp truy vấn lấy dữ liệu).
  • Phương thức fetch dùng để lấy từng dòng dữ
    liệu theo kết quả truy vấn được lưu ở thuộc tính $query (Trong trường
    hợp truy vấn lấy dữ liệu).
1. Thuộc tính (Property):

Để khai báo thuộc tính trong lớp, các bạn thực hiện theo mẫu sau:
Mã:
Phạm_vi $Tên_thuộc_tính;
Hoặc
Mã:
Phạm_vi $Tên_thuộc_tính = Giá_trị_của_thuộc_tính;
Thuộc tính trong lớp phải có phạm vị hoạt động (Tầm vực) và được thể hiện qua 3 từ khóa phạm vi sau:
  • Public: Có phạm vị sử dụng rộng nhất và không
    bị giới hạn. Nếu các bạn không khai báo phạm vi cho thuộc tính thì mặc
    định thuộc tính đó là public.
  • Protected: Có phạm vi hoạt động bên trong nội tại của lớp và các lớp kế thừa (Còn gọi là lớp con hay lớp dẫn xuất).
  • Private: Có phạm vi hoạt động hẹp nhất, chỉ hoạt động bên trong nội tại của lớp.
Ví dụ:
PHP:
public $a;
protected $b;
private $c;
Các bạn lưu ý về cách đặt tên thuộc tính (Áp dụng cho cả tên biến) như sau:
  • Tuân theo các qui tắc đặt tên biến.
  • Từ đầu tiên là chữ thường. Nếu có từ 2 từ trở
    lên thì chữ cái đầu tiên của từ thứ hai trở đi là chữ hoa (Ví dụ:
    $user, $userProfile, $deltailUserProfile).
Để gọi (Sử dụng) thuộc tính đã được khai báo các bạn thực hiện theo mẫu sau:
Mã:
$this->Tên_thuộc_tính;
Hoặc
Mã:
self::$Tên_thuộc_tính;
Hoặc
Mã:
parent::$Tên_thuộc_tính;
Ví dụ:
PHP:
$this->a;
self::$b;
parent::$c;
Với 3 mẫu trên, tùy từng trường hợp các bạn sử dụng cho đúng chứ
không phải muốn sử dụng mẫu nào cũng được. Các bạn có thể sử dụng như
sau:
  • Mẫu thứ nhất được dùng khi gọi một thuộc tính của chính lớp đó hoặc lớp cơ sở (Còn gọi là lớp cha).
  • Mẫu thứ hai được dùng khi gọi một thuộc tính của chính lớp đó.
  • Mẫu thứ ba được dùng khi gọi một thuộc tính của lớp cơ sở.
Trình bày thì đơn giản như vậy nhưng khi sử dụng thì tùy từng mục đích, yêu cầu mà các bạn sử dụng cho phù hợp. Ngoài ra, còn có một cách sử dụng nữa dành cho thuộc tính có phạm vi public tôi sẽ trình bày sau.

Các bạn có thể tìm hiểu thêm về thuộc tính tại địa chỉ
Bạn phải đăng nhập để xem liên kết Log in or register now.
.

2. Phương thức (Method):

Để khai báo phương thức trong lớp, các bạn thực hiện theo mẫu sau:
Mã:
Phạm_vi function Tên_phương_thức()
{
    //Nội dung phương thức
}
Hoặc
Mã:
Phạm_vi function Tên_phương_thức($Tham_số_1, $Tham_số_2, $Tham_số_n)
{
    //Nội dung phương thức
}
Ví dụ:
PHP:
public function query($sql)
{}
Phạm vi của phương thức hoàn toàn tương tự với phạm vi của thuộc tính.

Quy tắc đặt tên phương thức cũng tương tự như thuộc tính.

Để gọi (Sử dụng) phương thức đã khai báo các bạn thực hiện theo mẫu sau:
Mã:
$this->Tên_phương_thức();
Hoặc
Mã:
self::Tên_phương_thức();
Hoặc
Mã:
parent::Tên_phương_thức();
Ví dụ:
PHP:
$this->query('SELECT * FROM tbl_user');
self::fetch();
parent::get();
Ba cách sử dụng trên cũng hoàn toàn tương tự như thuộc tính.

Ngoài các phương thức do người lập trình định nghĩa, PHP còn cung cấp các phương thức magic như: __construct, __destruct... Các bạn có thể tìm hiểu thêm về các phương thức magic tại địa chỉ
Bạn phải đăng nhập để xem liên kết Log in or register now.
.

Thuộc tính và phương thức còn nhiều kiến thức nâng cao khác mà tôi không trình bày cho các bạn ở đây. Trong quá trình tìm hiểu, các bạn có vấn đề cần hỗ trợ thì các bạn có thể hỏi và tôi sẽ giải đáp cho các bạn.

3. Kế thừa (Extends):

Trong PHP, các bạn có thể mở rộng lớp, hay nói một cách khác, một lớp có thể được kế thừa từ một lớp nào đó đã được khai báo trước. Trong đó, lớp được kế thừa gọi là lớp cơ sở (Lớp cha), lớp kế thừa gọi là lớp dẫn xuất (Lớp con). Lớp dẫn xuất có quyền sử dụng các thuộc tính, phương thức có phạm vi public và protected của lớp cơ sở.

Một lớp có thể kế thừa các thuộc tính và phương thức của lớp khác, bằng cách sử dụng từ khóa extends. Các bạn có thể khai báo kế thừa theo mẫu sau:
Mã:
class Lớp_dẫn_xuất extends Lớp_cơ_sở
{}
Ví dụ:
PHP:
class Db extends MySql
{}
Với ví dụ trên, lớp Db được gọi là lớp dẫn xuất, lớp MySql được gọi là lớp cơ sở. Toàn bộ các thuộc tính, phương thức có phạm vi public và protected của lớp MySql (Lớp cơ sở) đều được lớp Db (Lớp dẫn xuất) kế thừa (Tức có quyền sử dụng).

Các bạn có thể tìm hiểu thêm về kế thừa (Chủ yếu là nói về từ khóa extends) tại địa chỉ
Bạn phải đăng nhập để xem liên kết Log in or register now.
.

Kế thừa và các kỹ thuật lập trình liên quan tới kế thừa các bạn có thể tìm hiểu thêm để mở rộng kiến thức.
 
Top