- Lấy đối tượng là nền tảng
- Tìm những đối tượng có sẵn hoặc xây dựng những đối tượng
- Sau đó kết hợp với nhau để giải quyết vấn đề
- Xây dựng những đối tượng mã lệnh có liên hệ khắn khít với đối tượng của thế giới thực
Ví dụ 3: Game bóng đá:
- Game bóng đá là một chương trình rất lớn chắc chắn nếu bạn muốn
làm nó bạn phải xây dựng nó trên mô hình hướng đối tượng. Vậy việc đầu
tiên của trước khi xây dựng game này bạn cần xác định các đối tượng
chính của game
- Những đối tượng chính của game mà bạn có thể dễ dàng nhìn thấy như:
o Câu lạc bộ
o Sân vận động
o Giải thi đấu
o Cầu thủ
o Huấn luyện viên
o Cổ động viên…
- Trong một ứng dụng lớn như game bóng đá các bạn sẽ thấy xuất hiện
rất nhiều đối tượng. Chúng ta sẽ phân tích thử một đối tượng trong game
đó là đối tượng con người.
- Con người là một lớp chính trong game từ đối tượng ‘con người’
chúng ta sẽ mở rộng ra các đối khác như cầu thủ, trọng tài, huấn luyện
viên, cổ động viên…
- Đơn giản hóa việc phát triển các chương trình
- Giúp tạo ra những chương trình có tính mềm dẻo và linh động cao (Khi sửa chữa bảo trì, nâng cấp dể dàng)
1. Lớp (Class)
- Trong lập trình các bạn thường có các kiểu dữ liệu như INT (INT
mô tả các số nguyên), STRING (mô tả cho chuỗi), FLOAT (mô tả cho số
thực)… nhưng nếu 1 kiểu dữ liệu mới xuất hiện thì chúng phải làm sao?
Lúc đó chúng ta sẽ phải tạo ra 1 định nghĩa cho kiểu dữ liệu mới đó
thông qua class. Nên class là một kiểu dữ liệu được định nghĩa trong
chương trình, là một sự nâng cao của structure.
- Ví dụ tôi muốn tạo ra một kiểu dữ liệu mới để mô tả một con mèo
thì lúc này tôi phải tạo ra một class để định nghĩa cho kiểu dữ liệu con
mèo
- Vậy một câu hỏi đặt ra muốn tạo một class để định nghĩa cho một
đối tượng mới chúng ta cần phải làm như thế nào? Điều này rất đơn giản.
Chúng ta chỉ cần xác định 2 vấn đề trước khi tạo một các class mô tả cho
một đối tượng đó là:
o Những thuộc tính của đối tượng.o Hành động của đối tượng
Ví dụ: Tạo class ConMeo
Để tạo class cho đối tượng ConMeo chúng ta cần xác định 2 phần:
- Thuộc tính (attribute)
o Tên
o tuổi
o màu lông
o …
- Hành động (phương thức – method)
o chạy
o kêu
o cắn
o cào
o …
Trong phần này chúng ta chỉ mô tả về một đối tượng chung chung không cụ thể là một đối tượng nào cả
Tập tin conmeo.class.php
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function run(){ return 'It is runing' ; } public function shout(){ return 'It is shoutting "meo meo"' ; } public function climb(){ return 'It is climbing' ; } } ?> |
2. Đối tượng (Object)
- Thể hiện một lớp thành một thực thể nào đó
- Có thể tạo nhiều đối tượng từ một lớp
Ví dụ:
1
2
| $conMeoA = new ConMeo(); $conMeoB = new ConMeo(); |
Ví dụ:
- Nhà tôi có một con mèo - Nhà bạn tôi có nuôi một con mèo
- Các đối tượng sẽ có đặc tính khác nhau
Ví dụ:
- Con mèo của tôi có tên là Mimi có lông màu trắng - Con mèo của bạn tôi có tên là Doremon có lông màu vàng
- Tuy 2 con mèo trên có những đặc điểm khác nhau nhưng nó cùng lớp là con mèo.
3. Lớp và đối tượng
- Lớp là một cái chung chung
- Đối tượng là một cái cụ thể
Ví dụ:
- Công thức là một lớp – Cái bánh là một đối tượng
- Mô tả về con mèo là một lớp – Con mèo nhà tôi là một đối tượng
4. Xây dựng lớp
- Tạo class
1
2
3
| Class ConMeo{ } |
- Khởi tạo đối tượng từ class
1
2
| $conMeoA = new ConMeo(); $conMeoB = new ConMeo(); |
5. Thuộc tính & phương thức (properties – method)
a. Thuộc tính
- Là các đặc tính, đặc điểm của một lớp. Thuộc tính bao gồm:
o Các biến: lưu trữ các giá trị
o Biểu thức get và set: cho phép lấy và gán giá trị
Ví dụ 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
| <?php //ConMeo.class.php class ConMeo{ private $name ; private $age ; private $color ; public function getName() { return $this ->name; } public function setName( $value ) { $this ->name = $value ; } public function getAge() { return $this ->age; } public function setAge( $value ) { $this ->age = $value ; } public function getColor() { return $this ->color; } public function setColor( $value ) { $this ->color = $value ; } } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
| <?php //index.php require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->setName( 'Mimi' ); $conMeoA ->setAge(3); $conMeoA ->setColor( 'Vàng' ); echo 'Tên: ' . $conMeoA ->getName() . '<br>' ; echo 'Tuổi: ' . $conMeoA ->getAge() . '<br>' ; echo 'Màu lông: ' . $conMeoA ->getColor() . '<br>' ; echo '<hr>' ; $conMeoB = new ConMeo(); $conMeoB ->setName( 'Mimi' ); $conMeoB ->setAge(3); $conMeoB ->setColor( 'Vàng' ); echo 'Tên: ' . $conMeoB ->getName() . '<br>' ; echo 'Tuổi: ' . $conMeoB ->getAge() . '<br>' ; echo 'Màu lông: ' . $conMeoB ->getColor() . '<br>' ; ?> |
b. Phương thức
- Là các hành động có thể được thực hiện từ lớp
- Phương thức cũng giống như hàm nhưng là hàm riêng của lớp
- Phương thức có thể nhận vào các tham số và trả về các giá trị
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| //conmeo.class.php Class ConMeo{ ..... public function showInfo(){ /*echo '<br>Tên: ' . $this->getName(); echo '<br>Tuổi: ' . $this->getAge(); echo '<br>Color: ' . $this->getColor(); echo '<hr>';*/ echo '<br>Tên: ' . $this ->name; echo '<br>Tuổi: ' . $this ->age; echo '<br>Color: ' . $this ->color; } } |
1
2
3
4
5
6
7
8
9
10
11
12
| //index.php <?php require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->setName( 'Mimi' ); $conMeoA ->setAge(3); $conMeoA ->setColor( 'Vàng' ); $conMeoA ->showInfo(); ?> |
Ví dụ 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| //conmeo.class.php Class ConMeo{ … public function run(){ return 'It is runing' ; } public function shout(){ return 'It is shoutting "meo meo"' ; } public function climb(){ return 'It is climbing' ; } } |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
| //index.php <?php require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->setName( 'Mimi' ); $conMeoA ->setAge(3); $conMeoA ->setColor( 'Vàng' ); $conMeoA ->showInfo(); echo 'Nó đang làm gì? - ' . $conMeoA ->run(); ?> |
6. Phương thức khởi tạo (__construct())
a. Phương thức __contruct()
Ví dụ 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // ConMeo.class.php <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function __construct(){ $this ->name = 'Mimi' ; $this ->age = 1; $this ->color = 'Vàng' ; } ... } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
| // index.php <?php class ConMeo{ require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->showInfo(); } ?> |
Output:
1
2
3
| Tên: Mimi Tuổi: 1 Color: Vàng |
b. Phương thức __contruct() với tham số
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // ConMeo.class.php <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function __construct( $name , $age , $color ){ $this ->name = $name ; $this ->age = $age ; $this ->color = $color ; } ... } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
| // index.php <?php class ConMeo{ require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo( 'Doremon' ,1000, 'Xanh' ); $conMeoA ->showInfo(); } ?> |
Output:
1
2
3
| Tên: Doremon Tuổi: 1000 Color: Xanh |
c. Phương thức __contruct() với tham số mặc định
Ví dụ 3:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // ConMeo.class.php <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function __construct( $name = 'Mimi' , $age = 1, $color = 'Vàng' ){ $this ->name = $name ; $this ->age = $age ; $this ->color = $color ; } ... } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
| // index.php <?php class ConMeo{ require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->showInfo(); } ?> |
Output:
1
2
3
| Tên: Mimi Tuổi: 1 Color: Vàng |
d. Hàm __contruct() với cách đặt tên trùng với tên class
Ví dụ 4:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // ConMeo.class.php <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function ConMeo( $name = 'Mimi' , $age = 1, $color = 'Vàng' ){ $this ->name = $name ; $this ->age = $age ; $this ->color = $color ; } ... } ?> |
1
2
3
4
5
6
7
| // index.php <?php require_once ( 'ConMeo.class.php' ); $conMeoA = new ConMeo(); $conMeoA ->showInfo(); ?> |
Output:
1
2
3
| Tên: Mimi Tuổi: 1 Color: Vàng |
e. Hàm __contruct() với tham số là mảng
Ví dụ 5:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| // ConMeo.class.php <?php class ConMeo{ //Khai bao cac thuoc tinh private $name ; private $age ; private $color ; public function __construct( $arrParama ){ $this ->name = $arrParama [ 'name' ]; $this ->age = $arrParama [ 'age' ]; $this ->color = $arrParama [ 'color' ]; } ... } ?> |
1
2
3
4
5
6
7
8
9
10
11
| // index.php <?php require_once ( 'ConMeo.class.php' ); $arrParama = array ( 'name' => 'Mimi' , 'age' => 2, 'color' => 'Vàng' ); $conMeoA = new ConMeo( $arrParama ); $conMeoA ->showInfo(); ?> |
Output:
1
2
3
| Tên: Mimi Tuổi: 2 Color: Vàng |
7. Tính chất kế thừa
Tính kế thừa trong là một ưu điểm của OOP nó giúp chúng ta mở rộng
và phát triển chương trình mà không làm ảnh hưởng đến những thành phần
đã có sẵn.
Ví dụ: Tạo lớp ConBao kế thừa từ lớp ConMeo
Tập tin ConBao.class.php
1
2
3
4
5
6
7
8
| <?php require_once 'ConMeo.class.php' ; class ConBao extends ConMeo{ public function showInfo(){ echo '<br>' . __METHOD__ ; echo 'Day la mot lop the hien con bao' ; } } |
Tập tin index.php
1
2
3
4
5
6
7
8
9
10
11
12
| <meta http-equiv= "Content-Type" content= "text/html; charset=utf-8" /> <?php require_once 'ConBao.class.php' ; $arrCatInfo = array (); $arrCatInfo [ 'name' ] = 'Mabu' ; $arrCatInfo [ 'age' ] = 5; $arrCatInfo [ 'color' ] = "Xám" ; $arrCatInfo [ 'weight' ] = "50 kg" ; $arrCatInfo [ 'height' ] = "70 cm" ; $conBaoA = new ConBao( $arrCatInfo ); $conBaoA ->showInfo(); |
8. Hàm __destruct()
Hàm __destruct() là một hàm thực sự rất khó hiểu trong PHP
và nhiều lập trình viên không biết sử dụng nó vào mục đích gì. Theo lý
thuyết hàm này sẽ được tự động gọi sau khi một đối tượng được khởi tạo
và nó thực hiện hủy một số giá trị nào nào.
Hàm __destruct() là phương thức tự động chạy khi đối tượng
được khởi tạo. Nó chỉ thực thi những lệnh trong thân hàm ở cuối trang
mà đối tượng được khởi tạo.
Phương thức này thường dùng để
- Hủy hoặc tạo một session.
- Giải phóng bộ nhớ
- Đóng kết nối của ứng dụng đến Database
- Đóng kết nối của khi chúng ta mở một tập tin
- …
Ví dụ 1: Vị trí hàm __destruct() thực thực thi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php //User.class.php class User{ private $name ; private $permission ; public function __construct( $name , $permission ) { echo '<br> Construct function' ; $this ->name = $name ; $this ->permission = $permission ; } function __destruct() { echo '<br> Destruct function' ; } } ?> |
1
2
3
4
5
6
7
8
| <?php //index.php require_once ( 'User.class.php' ); $obj = new User( 'zendvn' , 'Administrator' ); echo '<br>This is a test 1' ; echo '<br>This is a test 2' ; echo '<br>This is a test 3' ; ?> |
Ví dụ 2: Khởi tạo một session
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
| <?php //User.class.php class User{ private $name ; private $pass ; private $lastName ; private $firstName ; private $website ; public function __construct( $name , $pass ) { echo '<br> Construct function' ; if ( $name == 'KhanhPham' && $pass = '123456' ){ $this ->name = $name ; $this ->pass = $pass ; $this ->getInfo(); } } public function getInfo(){ $this ->lastName = 'Vũ Khánh' ; $this ->firstName = 'Phạm' ; } function __destruct() { echo '<br> Destruct function' ; $_SESSION [ 'user' ] = serialize( $this ); } } ?> |
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
| <?php //index.php session_start(); require_once 'User.class.php' ; $user = new User( 'KhanhPham' , '123456' ); <?php session_start(); if (isset( $_SESSION [ 'user' ])){ $userInfo = unserialize( $_SESSION [ 'user' ]); echo "<pre>" ; print_r( $userInfo ); echo "</pre>" ; } unset( $_SESSION [ 'user' ]); |
Ví dụ 3: Giải phóng bộ nhớ và đóng kết nối với Database
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
| <?php //Database.class.php class Database { private $hostname = 'localhost' ; private $username = 'root' ; private $password = '' ; private $db = 'test' ; private $dbCon = null; private $result ; private $connection ; private $flagConnect ; public function __construct() { $connection = mysql_connect ( $this ->hostname, $this ->username, $this ->password ); if (! $connection ) { die ( 'Could not connect: ' . mysql_error () ); } else { $this ->connection = $connection ; $this ->flagConnect = true; mysql_select_db( $this ->db, $connection ); } } public function fetchAll( $table_name ){ if ( $this ->flagConnect == true) { $sql = 'SELECT * FROM ' . $table_name ; $this ->result = mysql_query( $sql ); return $this ->result; } } function __destruct() { if ( $this ->flagConnect == true) { mysql_free_result( $this ->result); mysql_close ( $this ->connection ); } } } ?> |
1
2
3
4
5
6
7
8
9
10
| <?php //index.php require_once 'Database.class.php' ; $db = new Database(); $result = $db ->fetchAll( 'user_group' ); while ( $row = mysql_fetch_assoc( $result )){ echo '<br>' . $row [ 'id' ] . ' - ' . $row [ 'group_name' ]; } |
9. Hàm clone
Hàm này dùng để sao chép một đối tượng từ một đối tượng khác.
Ví dụ 1: Sao chép một đối tượng không sử dụng phương thức clone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <?php require_once 'ConMeo.class.php' ; $conMeoA = new ConMeo(); $conMeoA ->setName( "Tiger" ); $conMeoA ->setAge(3); $conMeoA ->setColor( 'Vàng' ); $conMeoB = $conMeoA ; $conMeoB ->setName( "Doremon" ); $conMeoB ->setAge(2); echo '<br>-------------------------<br>' ; echo 'In thong tin con meo A <br>' ; $conMeoA ->showInfo(); echo '<br>-------------------------<br>' ; echo 'In thong tin con meo B <br>' ; $conMeoB ->showInfo(); ?> |
Ví dụ 2: Sao chép một đối tượng sử dụng phương thức clone
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
| <?php require_once 'ConMeo.class.php' ; $conMeoA = new ConMeo(); $conMeoA ->setName( "Tiger" ); $conMeoA ->setAge(3); $conMeoA ->setColor( 'Đen' ); $conMeoB = clone $conMeoA ; $conMeoB ->setName( "Doremon" ); $conMeoB ->setAge(2); echo '<br>-------------------------<br>' ; echo 'In thong tin con meo A <br>' ; $conMeoA ->showInfo(); echo '<br>-------------------------<br>' ; echo 'In thong tin con meo B <br>' ; $conMeoB ->showInfo(); ?> |
10. self & parent
a. self
Là đại diện cho cách khởi tạo lớp hiện thời và thường được sử dụng
gọi đến biến số có khóa static hay hàm nào đó trong lớp đang hiện tại.
Ví dụ 1:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <?php class ConMeo{ private $name ; private $age ; private $color ; public static $maxSpeed = '30km/h' ; // Code cũ ... public function showInfo(){ echo '<br> Tên con mèo là: ' . $this ->getName(); echo '<br> Tuổi: ' . $this ->getAge(); echo '<br> Màu lông: ' . $this ->getColor(); echo '<br>Nó đang làm gì? - ' . self::run(); echo '<br>Tốc độ tối đa của nó là: - ' . self:: $maxSpeed ; } // Code cũ ... } |
Ví dụ 2:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
| <?php class ConMeo{ private $name ; private $age ; private $color ; public static $maxSpeed = '30km/h' ; // Code cũ ... public function showInfo(){ echo '<br> Tên con mèo là: ' . $this ->getName(); echo '<br> Tuổi: ' . $this ->getAge(); echo '<br> Màu lông: ' . $this ->getColor(); echo '<br>Nó đang làm gì? - ' . ConMeo::run(); echo '<br>Tốc độ tối đa của nó là: - ' . ConMeo:: $maxSpeed ; } // Code cũ ... } |
b. parent
Đại diện cho class cha của lớp đang thừa kế và thường được sử dụng
gọi đến biến số có khóa static hay hàm nào đó trong lớp cha của lớp hiện
tại hiện tại.
1
2
3
4
5
6
7
8
9
10
11
12
| <?php require_once ( 'ConMeo.class.php' ); class ConBao extends ConMeo{ public static $maxSpeed = '90km/h' ; public function showInfo(){ parent::showInfo(); echo '<br>Tốc độ tối đa của nó là: - ' . self:: $maxSpeed ; } } ?> |
1
2
3
4
5
6
7
| <?php require_once ( 'ConBao.class.php' ); $conBaoA = new ConBao(); $conBaoA ->showInfo(); ?> |
11. PPP (public – protected – private)
Giống như mọi ngôn ngữ lập trình hướng đối tượng khác
public: Có thể truy cập từ mọi nơi
protected: chỉ sử dụng cho class đó và các class được mở rộng từ class đó
private: chỉ sử dụng ở trong chính class đó
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| <?php class sample { public $a = 1; private $b = 2; protected $c = 3; function __construct() { echo $this ->a . $this ->b . $this ->c; } } class miniSample extends sample { function __construct() { echo $this ->a . $this ->b . $this ->c; } } $a = new sample(); $b = new miniSample(); echo $a ->a . $a ->b . $a ->c; ?> |
Không có nhận xét nào:
Đăng nhận xét