Thứ Sáu, 2 tháng 1, 2015

lập trình hướng đối tượng php

Học PHP: Lập trình hướng đối tượng với PHP

Lập trình hướng đối tượng với PHP giúp cho việc lập trình trở nên dễ dàng hơn. Lập trình bây giờ không giống như với ngày trước, tất cả đều hướng về tạo dựng một đối tượng. Xây dựng đối tượng trong PHP làm cho code trở nên rõ ràng, trong sáng và dễ sửa đổi sau này hơn.
Trong PHP, người ta đã cung cấp cho chúng ta sẵn các hàm để định nghĩa đối tượng, và xây dựng đối tượng khá là đầy đủ. Đễ tiết kiệm chữ viết và thời gian đọc của các bạn, tôi xin gọi tắt “đôi tượng” ở đây là “class”.

Hình dung một class

Nếu là người mới lập trình hoặc người đã quen với cách xây dựng hàm và gọi hàm cổ điển. Thì sẽ thấy việc sử dụng class trong lập trình trở nên nhọc nhằng và khó tiếp cận. Mình hiểu vấn đề đó, vì khi lần đầu mình nghe đến định nghĩa class cũng thấy hơi khó chịu. Tuy nhiên mình sẽ làm bạn cảm thấy dễ chịu hơn khi lập trình hướng đối tượng bằng ngôn ngữ PHP qua bài viết này.

Điểm khác biệt giữa lập trình hướng đối tượng và lập trình hướng thủ tục (hàm)

lập trình hướng đối tượng php
Đối với lập trình theo hướng thủ tục, tức cách mà ta vẫn thường làm. Xây dựng một hàm, rồi include nó từ một file khác, gọi hàm, … .
1
ham_cua_tui();
Còn sử dụng đối tượng thì sao. Để gọi một hàm mà sử dụng đối tượng thì ít nhất bạn phải tốn 2 dòng code.
1
2
3
$obj = new myClass();
 
$obj -> ham_cua_tui();
Một để tạo mới đối tượng. Và một để gọi hàm. Mình sẽ nói cho bạn nghe vì sao mà đối tượng tuy dài nhưng lại được ưa chuộng đến thế.
  • Thứ nhất, là sử dụng đối tượng làm cho ta cảm thấy gần gũi hơn. Vì từ trước giờ, con người đã quen với việc “tương tác” lên một “đối tượng”. Mọi thứ xung quanh ta đều là đối tượng: chiếc laptop, cái điện thoại, hay cái TV, … tất cả đều là đối tượng. Cũng vì vậy mà người ta cũng làm code trở thành một đối tượng.
  • Bạn sẽ cảm thấy được sự quan hệ tương tác qua lại giữa các đối tượng khi lập trình. Chẵn hạng như:
    1
    2
    3
    4
    Mảnh đất = new class Mảnh đất;
    Ngôi nhà = new class Nhà;
     
    Mảnh đất -> thêm ( Ngôi nhà );
    Bạn sẽ cần một thời gian để thấy được sự rời nhau của từng đối tượng trong code, và tưởng tượng ra được sự tương tác của chúng với nhau. Và cũng đừng lo ngại, vì ngày đó sẽ đến sớm.
  • Điều cuối cùng làm cho class trở thành một công cụ tuyệt vời khi lập trình. Đó là sự dùng lại của class con với class cha. Làm cho code dễ dàng cải tiến nhanh chóng dựa trên những cái cũ.

3 điều cần quan tâm khi xây dựng một class

class ke thua
Một class có 3 thứ quan trọng.
  • Kế thừa – class đang xây dựng có cần phải kế thừa class nào khác để có thể hoạt động hay không
  • Thuộc tính – các thuộc tính mà class này cần có, hiểu nôm nà nó là một biến toàn cục dùng chung trong các hàm của class này và bên ngoài trong một số trượng hợp
  • Hàm – và phần quan trọng nhất. Bạn có thể hiểu đơn giản, đây là các chức năng mà class cung cấp. Trong đó có một hàm đặc biệt, gọi là hàm xây dựng – construct. Hàm này sẽ được gọi ngay lúc bạn new một class. Thường được dùng để khởi tạo giá trị cho biến.
Kế thừa Nếu bạn mới nghe nó lần đầu thì, Ok mình sẽ giải thích cho bạn. Kế thừa ý ám chỉ việc một class con, sử dụng lại các thuộc tính, và hàm của class cha để hoạt động. Về mặt lưu trữ, thì trong class con sẽ chứa luôn class cha. Đừng hiểu ngược lại là cha chứa con nhé.

Xây dựng class bằng PHP

Tiến hành tạo một class đơn giản, qua ví dụ bên dưới ta sẽ tạo một class mới tên là myClass:
01
02
03
04
05
06
07
08
09
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
// Khai báo tên class
 
class myClass {
 
    // Nội dung bên trong class
    // Các thuộc tính của class
 
    private $pri;
    public $pub;
    protected $pro;
 
    // Hàm của class
 
    function __construct() {
 
        // Hàm construct
 
        $this->pri = "Biến private";
        $this->pub = "Biến public";
        $this->pro = "Biến protected";
    }
 
    function xuat() {
 
        // Hàm xuất trị
 
        echo '$pri: ' . $this->pri;
        echo '$pub: ' . $this->pub;
        echo '$pro: ' . $this->pro;
    }
 
}
 
// Kết thúc một khai báo hàm
Biến $this
Biến $this dùng để ám chỉ đối tượng hiện tại, class mà bạn đang viết code. Việc dùng $this để gọi, hoặc đọc và ghi giá trị vào biến thuộc phạm vi chung của class là bắt buộc. Ví dụ:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
class A {
    private $bien1;
    function hamA() {
        echo "Hàm hamA() của class A được gọi";
    }
    function hamB() {
        // hamB() muốn gọi hàm hamA của class
        $this -> hamA();
        // hamB() muốn đặt giá trị cho biến $bien1
        $this -> bien1 = "Hello";
    }
}
// Hết class A
 
function hamA() {
    echo "Hàm hamA() bên ngoài class";
}
Nếu bạn cố ý gọi hamA() mà không dùng $this -> hamA(). Thì PHP sẽ gọi hamA() bên ngoài class, chứ không gọi hamA() trong class. Hoặc PHP sẽ báo lỗi.
Đối với biến, nếu bạn cố ý gán bằng lệnh $bien1 = “Hello”; Thì biến cục bộ $bien1 sẽ được tạo bên trong hamB(), và lưu giá trị là “Hello” chứ không lưu vào biến $bien1 ở dòng 2. Nói chung, ta phải dùng “$this ->” để gọi hàm hoặc những biến thuộc về class.
Lưu ý
Xin nhớ kỹ là khi thao tác với biến: $this -> tenbien. Không phải là $this -> $tenbien.

Phân biệt private, public, protected khi lập trình hướng đối tượng với PHP

Điểm chung duy nhất của 3 từ khóa này đều là từ khóa chỉ tầm vực của biến. Hay con gọi là ngữ cảnh, phạm vi mà biến này có thể được truy cập từ.
Khác nhau:
  • Private: Khắt khe nhất, chỉ trong class khai báo biến này mới có quyền sử dụng.
  • Public: Có thể truy cập từ mọi nơi thông qua câu lệnh $obj -> tên_biến;
  • Protected: Ít khắt khe hơn Private một chút, ở ngoài class không thể truy cập được biến này. Tuy nhiên class con thì có thể.
Ví dụ minh họa:
1
2
3
4
5
6
7
8
9
// Sử dụng lại class ở code trên
 
$class = new myClass();
 
echo $class->pub; // Biến public
echo $class->pri; // Lỗi fatal
echo $class->pro; // Lỗi fatal
 
$class -> xuat(); // Biến public, Biến private, Biến protected
Như đã nói ở trên, biến private và protected chỉ dùng được bên trong class. Đó là lý do hàm xuat() có thể dùng được 2 biến này để xuất ra kết quả.
Và không chỉ áp dụng với biến, 3 từ khóa này còn được áp dụng cho hàm với ý nghĩa tương tự. Khác với biến một tí, là khi không để từ khóa này vào thì mặc định hàm sẽ là public. Tức có thể gọi hàm từ bên ngoài class.

Class kế thừa

Cách kế thừa khá giống C++.  Như giới thiệu ở trên, class con kế thừa class cha sẽ thừa hưởng tất cả các thuộc tính, hàm của class cha. Chúng ta cùng xem lại sơ đồ một class.
class ke thua
Trong php, dùng từ khóa “extends” khi khai báo class để biểu thị là class này đang sử dụng lại một class khác làm cha của nó.
1
2
3
class myNewClass extends myClass {
    // code
}
Như đoạn code trên là myNewClass kế thừa myClass.
Trong class con có thể gọi lại các hàm không phải là private của class cha như là một hàm của chính nó. (myClass là class ở đầu bài)
1
2
3
4
5
6
7
8
class myNewClass extends myClass {
 
    function xuat2() {
        echo "Hàm được gọi từ class con";
        $this->xuat();
    }
 
}
Vậy class con này sẽ có những đặc tính quan trọng?
Class con có thể trực tiếp truy cập biến và gọi hàm của class cha được khai báo với từ khóa “public” hoặc “protected”.
Về lưu trữ, class con là một class lớn hơn class cha. Và chứa luôn cả class cha (xem hình trên).

Viết hàm đè lên hàm cũ của class cha

Khi viết code cho class con, nếu bạn cảm thấy một hàm của class cha không phù hợp, và bạn muốn viết lại hàm này, viết đè lên hàm cũ của class cha.
Việc viết đè hàm này còn gọi là override
Việc viết đè rất đơn giản, ta chỉ cần khai báo một hàm với tên y chang tên hàm của class cha, PHP sẽ tự hiểu bạn đang muốn làm gì. Ví dụ về viết đè hàm:
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
class CoBan {
    function print() {
        echo "Hàm print() của class CoBan";
    }
}
 
class KeThua extends CoBan {
    function print() {
        echo "Hàm print() của class KeThua";
    }
}
 
$obj1 = new CoBan();
$obj2 = new KeThua();
 
$obj1 -> print(); // Xuất: Hàm print() của class CoBan
$obj2 -> print(); // Xuất: Hàm print() của class KeThua

Gọi lại hàm đã bị viết đè

Ở trên ta vừa tìm hiểu về viết đè hay override hàm của class cha trong PHP. Vậy trường hợp hàm đã bị ghi đè mất rồi thì ta sẽ không gọi được nữa. Làm sao để gọi lại hàm của class cha đây? PHP giải quyết vấn đề này bằng từ khóa parent::.
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
class A {
    function print() {
        echo "A";
    }
}
 
//Class B kế thừa class A
class B extends A {
    function print() {
        parent::print(); // gọi hàm print() của class A
        echo "B";
    }
}
 
$obj = new A();
$obj -> print(); // Kết quả: A
 
$obj = new B();
$obj -> print(); // Kết quả: AB

Nhận xét

PHP là một ngôn ngữ mạnh và linh hoạt hỗ trợ tốt việc lập trình hướng đối tượng. PHP cung cấp một môi tường vô cùng thuận lợi để chúng ta lập trình hướng đối tượng.
Bài viết được viết và trình bày bởi Minh Nhựt (minhnhut.info). Tài liệu tham khảo: PHP.net, phpro.org.
Và bây giờ là thời gian cho câu hỏi …

Không có nhận xét nào:

Đăng nhận xét