KẾT NỐI DB (PHẦN 3)
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, bạn tạo mới hai file MySql.php và Db.php để viết mã lệnh kết nối DB.
Nội dung file libraries/MySql.php như sau:
PHP:
<?php
class MySql {
protected $_query;
public function __construct(){
//Connect
$connection = mysql_pconnect(Config::DB_SERVER, Config::DB_USERNAME, Config::DB_PASSWORD) or die('Not connected DB!');
$dbSelected = mysql_select_db(Config::DB_DATABASE, $connection) or die('Not selected DB!');
//Set UTF8
mysql_query('SET NAMES UTF8', $connection);
}
public function query($sql){
//Truy vấn và return
return $this->_query = mysql_query($sql);
}
public function fetch(){
//Fetch và return
return mysql_fetch_assoc($this->_query);
}
}
?>
Nội dung file libraries/Db.php như sau:
PHP:
<?php
require 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 file libraries/MySql.php. Vậy lớp Db được viết trong file 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à tôi hi vọng các bạn sẽ tìm hiểu thêm.
Các bạn lưu ý tới hai 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).
* 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:
Phạm_vi $Tên_thuộc_tính;
Hoặc
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 ba 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 hoặc 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):
- 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ừ hai 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).
- Những thuộc tính có phạm vi protected và private thì tên thuộc tính bắt đầu bằng dấu gạch dưới "_" (Ví dụ: $_query).
Để 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:
$this->Tên_thuộc_tính;
Hoặc
self::$Tên_thuộc_tính;
Hoặc
parent::$Tên_thuộc_tính;
Ví dụ:
PHP:
$this->a;
self::$_b;
parent::$_c;
Với ba 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.
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 ở liên kết
https://php.net/manual/en/language.oop5.properties.php.
* 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:
Phạm_vi function Tên_phương_thức(){
//Nội dung phương thức
}
Hoặc
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:
$this->Tên_phương_thức();
Hoặc
self::Tên_phương_thức();
Hoặc
parent::Tên_phương_thức();
Ví dụ:
PHP:
$this->query('SQL');
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" ở liên kết
https://php.net/manual/en/language.oop5.magic.php.
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.
* 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:
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) ở liên kết
https://php.net/manual/en/keyword.extends.php.
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.