Hướng đối tượng

Cơ bản về lập trình hướng đối tượng!!!

Bài này do thầy Huy viết ,mình thấy hay nên lưu lại đây để ai cần vào đọc và quan trọng là lúc nào rảnh mình vào đọc lại .hihi.

     Đối với nhiều lập trình viên PHP, Lập Trình Hướng Đối tượng có vẻ là 1 khái niệm      gì đó rất kinh khủng và khó hiểu, với rất nhiều cú pháp phức tạp và trở ngại khác        nhau. Qua bài hướng dẫn này, các bạn sẽ được tìm hiểu một số khác niệm về          lập trình hướng đối tượng (OOP) trong PHP, một phong cách mã lệnh có các            action liên quan lẫn nhau được nhóm thành các class, giúp tăng khả năng rút gọn      mã mà vẫn giữ được tính hiệu quả cho chúng.

Vậy Thế Nào Là Lập Trình Hướng Đối Tượng ?

“Lập trình hướng đối tượng là 1 phương pháp viết mã cho phép các lập trình viên nhóm các action tượng tự nhau vào các class”. Điều này giúp mã lệnh giữ vững được nguyên lý DRY “don’t repeat yourself” (không lặp lại chính nó) và dễ dàng để bảo trì.

Một lợi ích to lớn của nguyên lý lập trình DRY là: nếu một phần thông tin nào đó được thay đổi trong chương trình của bạn, thì thông thường chỉ cần có duy nhất 1 thay đổi để cập nhật lại mã lệnh. Một trong những ác mộng lớn nhất đối với các lập trình viên là bảo trì mã lệnh, nơi dữ liệu được khai báo đi khai báo lại nhiều lần, họ phải tìm kiếm, làm việc trên các dữ liệu và chức năng trùng lặp.

Thật ra Lập Trình Hướng Đối Tượng trở nên đáng sợ đối với rất nhiều lập trình viên bởi nó mang đến các cú pháp khá mới mẻ và cầu kỳ , do vậy nó nhanh chóng trở nên phức tạp hơn rất nhiều so với lập trình hướng thủ tục. Tuy nhiên, nếu các bạn nhìn nhận vấn đề 1 cách kỹ lưỡng hơn, Lập Trình Hướng Đối Tượng thực ra lại là 1 phương pháp rất đơn giản, giúp cho việc lập trình đơn giản hóa đi rất nhiều.

Hiểu Về Đối Tượng (Objects) Và Lớp (Class)

Trước khi bạn có thể đi sâu vào cái tinh túy của Lập Trình Hướng Đối Tượng, một cái nhìn căn bản về sự khác nhau giữa object và class là rất cần thiết. Phần này chúng ta sẽ đi vào việc xây dựng từng phần của class, khả năng khác nhau và một số công dụng của chúng.

Nhận thức sự khác nhau giữa Object và Class
Ví dụ về lập trình hướng đối tượng
Đôi khi có một số quan niệm nhầm lẫn trong hướng đối tượng: nhiều lập trình viên có kinh nghiệm cho rằng hai khái niệm object và class có thể thay thế cho nhau. Tuy vậy, đây không phải là vấn đề đáng quan tâm, mặc dù sự khác nhau giữa object và class có thể sẽ rất phức tạp khiến bạn phải bù đầu để tìm hiểu khi mới tiếp xúc với chúng.

Nhìn vào hình ví dụ phía trên, một class cũng giống như một bản thiết kế của một ngôi nhà. Nó định nghĩa hình dạng của ngôi nhà trên giấy, với các mối quan hệ giữa những phần khác nhau của ngôi nhà được xác định rõ và lên kế hoạch cụ thể, mặc dù ngôi nhà chưa thực sự tồn tại.

Một object sau đó, cũng giống như một ngôi nhà thực tế được xây dựng dựa trên bản thiết kế này. Dữ liệu trong object ở đây có thể được xem như là gỗ, dây điện, và bê tông để tạo nên ngôi nhà hoàn chỉnh: mà không hề có chi tiết cách tạo ra chúng trong bản thiết kế. Tuy nhiên, khi kết hợp tất cả lại với nhau, nó sẽ trở thành một ngôi nhà hoàn chỉnh đến từng chi tiết.

Các Class xử lý cấu trúc dữ liệu và các action, đồng thời sử dụng các thông tin đó để xây dựng các object. Có thể có nhiều hơn một object được xây dựng từ cùng một class tại cùng một thời điểm, mỗi object này đều là 1 cá thể độc lập và không phụ thuộc lẫn nhau. Trở lại vấn đề xây dựng, điều này cũng giống như một quần thể các lô nhà có thể được xây dựng trên cùng một bản thiết kế: 150 ngôi nhà khác nhau đều có hình dạng giống nhau, nhưng có các hộ gia đình và nội thất bên trong đều khác nhau.

Cấu trúc Class

Cú pháp để tạo ra một class khá đơn giản: để khai báo một class ta sử dụng từ khóa class, theo sau từ khóa là tên của class và một cặp ngoặc nhọn ({ }):
1 <?php
2 class MyClass {
3 // Class properties and methods go here
4 }
5 ?>

Sau tạo ra class, bạn có thể khởi tạo và lưu trữ chúng trong một biến bằng cách sử dụng từ khóa new:

1 <?php
2 $obj new MyClass;
3 ?>

Để xem nội dung của class, bạn sử dụng hàm var_dump():

1 <?php
2 var_dump($obj);
3 ?>

Hãy thử lại quá trình này bằng cách đặt toàn bộ các mã lệnh phía trên vào tập tin có tên là test.php và đặt nó vào trong locahost của bạn:

1 <?php
2 class MyClass {
3 // Class properties and methods go here
4 }
5 $obj new MyClass;
6 var_dump($obj);
7 ?>

Mở trình duyệt của bạn và chạy http://localhost/test.php , bạn sẽ nhìn thấy như sau:

object(MyClass)#1 (0) { }
Vậy là xong, bạn đã vừa hoàn thành script hướng đối tượng (OOP) đầu tiên của bạn dưới hình thức đơn giản nhất.

Định nghĩa thuộc tính của Class

Để thêm dữ liệu vào một class, người ta sử dụng thuộc tính, hoặc một biến riêng biệt nào đó. Chúng hoạt động tương tự như các biến thông thường, chỉ khác một điều là chúng đang liên kết với object và vì thế để có thể truy cập và sử dụng được chúng ta phải thông qua object hay nói cách khác là sử dụng object.

Để thêm một thuộc tính vào MyClass, bạn thêm đoạn mã sau vào script của bạn:

01 <?php
02
03 class MyClass
04 {
05     public $prop1 "I'm a class property!";
06 }
07
08 $obj new MyClass;
09
10 var_dump($obj);
11
12 ?>

Từ khóa public xác định tầm vực của thuộc tính. Tiếp đó, tên của thuộc tính được đặt đúng theo chuẩn cú pháp đặt tên cho biến, và một giá trị đã được gán cho nó (mặc dù thuộc tính của class không nhất thiết phải có giá trị ban đầu). Tuy nhiên chúng ta sẽ tìm hiểu về chúng ở các phần sau.

Để đọc thuộc tính này và xuất chúng ra trình duyệt, chúng ta sẽ phải tham chiếu chúng thông qua các object:

1 <?php
2 echo $obj->prop1; 
3 ?>

Nếu chúng ta không khai báo object, chương trình sẽ không thể xác định được thuộc tính đó thuộc object nào (vì hiểu 1 cách đơn giản object là đại diện cho class). Sử dụng dấu mũi tên (->) là một cấu trúc của Hướng Đối Tượng, để một object có thể truy cập được nội dung của thuộc tính và phương thức trong class.

Sửa lại mã lệnh file test.php như sau:

01 <?php
02
03 class MyClass
04 {
05     public $prop1 "I'm a class property!";
06 }
07
08 $obj new MyClass;
09
10 echo $obj->prop1; // Xuất thuộc tính ra trình duyệt
11
12 ?>

Và bây giờ Reload lại trình duyệt của để được kết quả như sau:

I’m a class property!
 

Định nghĩa Phương thức của Class

Phương thức là các hàm riêng biệt của class. Các action riêng lẻ, mà một object sẽ thực thi, thì được định nghĩa bên trong class như là các phương thức.

Ví dụ, để tạo ra các phương thức có khả năng thiết lập và trả về giá trị của thuộc tính$prop1, ta thêm đoạn mã như sau:

01 <?php
02
03 class MyClass
04 {
05     public $prop1 "I'm a class property!";
06
07     public function setProperty($newval)
08     {
09         $this->prop1 = $newval;
10     }
11
12     public function getProperty()
13     {
14         return $this->prop1 . "<br />";
15     }
16 }
17
18 $obj new MyClass;
19
20 echo $obj->prop1;
21
22 ?>

Chú ý: Hướng Đối Tượng cho phép các object tự tham chiếu chính nó (tham chiếu bên trong class) bằng cách sử dụng biến $this. Khi làm việc bên trong 1 phương thức, sử dụng $this cũng giống như cách bạn sử dụng object name bên ngoài class.

Để sử dụng các phương thức này, việc gọi chúng cũng tương tự như sử dụng các hàm thông thường, nhưng chúng ta phải thông qua object để tham chiếu đến chúng. Echo thuộc tính từMyClass, thay đổi giá trị của nó, và echo nó một lần nữa để xem sự thay đổi:

01 <?php
02
03 class MyClass
04 {
05     public $prop1 "I'm a class property!";
06
07     public function setProperty($newval)
08     {
09         $this->prop1 = $newval;
10     }
11
12     public function getProperty()
13     {
14         return $this->prop1 . "<br />";
15     }
16 }
17
18 $obj new MyClass;
19
20 echo $obj->getProperty(); // echo giá trị của thuộc tính
21
22 $obj->setProperty("I'm a new property value!"); // Thiết lập giá trị mới
23
24 echo $obj->getProperty(); // echo nó lại 1 lần nữa để xem sự thay đổi
25
26 ?>
Reload lại trình duyệt, và bạn sẽ nhìn thấy như sau:
I’m a class property!
I’m a new property value!
“Sức mạnh của Hướng Đối Tượng càng bộc lộ rõ khi chúng ta sử dụng cùng một class cho nhiều trượng hợp”
01 <?php
02
03 class MyClass
04 {
05     public $prop1 "I'm a class property!";
06
07     public function setProperty($newval)
08     {
09         $this->prop1 = $newval;
10     }
11
12     public function getProperty()
13     {
14         return $this->prop1 . "<br />";
15     }
16 }
17
18 // Tạo hai objects
19 $obj new MyClass;
20 $obj2 new MyClass;
21
22 // Echo giá trị của $prop1 từ hai object
23 echo $obj->getProperty();
24 echo $obj2->getProperty();
25
26 // Thiết lập giá trị mới cho thuộc tính $prop1 của từng object
27 $obj->setProperty("I'm a new property value!");
28 $obj2->setProperty("I belong to the second instance!");
29
30 // Echo lại giá trị của $prop1 từ hai object để xem sự thay đổi
31 echo $obj->getProperty();
32 echo $obj2->getProperty();
33
34 ?>
Khi bạn xem chúng trên trình duyệt, bạn sẽ nhận được kết quả như sau:
I’m a class property!
I’m a class property!
I’m a new property value!
I belong to the second instance!
Như bạn có thể thấy,Hướng Đối Tượng giữ các object như các thực thể riêng biệt, nhờ đó làm cho việc tách mã lệnh thành các phần nhỏ khác nhau mà vẫn giữ được mối liên hệ nhất định giữa chúng một cách dễ dàng.

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s