Đối tượng và Lớp trong PHP

15.06.2017 / 20:46
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Đối tượng, Thuộc tính và Phương thức trong thực tế

Trong thực tế, chúng ta có thể bắt gặp rất nhiều thứ được gọi là đối tượng (object). Xe ô tô là một ví dụ.

[IMAGE]

Một chiếc ô tô có các thuộc tính (property) như tên, khối lượng, màu sắc, ... và các phương thức (method) như khởi động, dừng lại, ...

Tất cả mọi chiếc ô tô đều có cùng thuộc tính, nhưng giá trị của thuộc tính khác nhau

Tất cả mọi chiếc ô tô đều có cùng phương thức, nhưng được thực hiện vào các thời điểm khác nhau.

Đối tượng trong PHP (hoặc nhiều ngôn ngữ lập trình khác) có sự tương quan với đối tượng trong thực tế mà các bạn sẽ tìm hiểu trong phần còn lại của bài viết.

LỚP TRONG PHP

Một lớp (class) đơn giản được định nghĩa như sau:

PHP
  1. class car {
  2. // khau báo hằng số
  3. const OWNER = 'MrKen';
  4. // khai báo thuộc tính
  5. public $color = 'white';
  6. // khai báo phương thức
  7. public function showColor()
  8. {
  9. echo $this->color;
  10. }
  11. }

Trong đó, OWNER là một hằng số, $color là một thuộc tính của đối tượng car và có giá trị là 'white', showColor() là một phương thức của đối tượng car, có chức năng hiển thị thuộc tính $color

Biến $this là biến tham chiếu đến đối tượng, có sẵn khi một phương thức hoặc một thuộc tính được gọi từ trong đối tượng.

Từ khóa new

Để gọi một đối tượng, cần phải sử dụng từ khóa new. Một đối tượng mới sẽ được tạo ra.

Ví dụ

PHP
  1. $myObj = new myClass();
  2. // Cũng có thể gọi từ biến
  3. $myClassName = 'myClass';
  4. $myObj = new $myClassName(); // new myClass()

Truy cập thuộc tính và gọi phương thức của đối tượng

PHP
  1. class Foo
  2. {
  3. public $bar = 'property';
  4.  
  5. public function bar() {
  6. return 'method';
  7. }
  8. }
  9.  
  10. $obj = new Foo();
  11. echo $obj->bar, PHP_EOL, $obj->bar();

Kết quả

TEXT
  1. property
  2. method

Hàm khởi tạo Lớp

Hàm khởi tạo lớp là hàm sẽ thực thi mỗi khi đối tượng mới được tạo ra.

PHP
  1. class Foo
  2. {
  3. public $bar = 'HanhPhucAo';
  4.  
  5. function __construct()
  6. {
  7. $this->bar = 'MrKen';
  8. }
  9.  
  10. public function bar() {
  11. return $this->bar;
  12. }
  13. }
  14.  
  15. $foo = new Foo();
  16. echo $foo->bar;

Kết quả

PHP
  1. MrKen

Mở rộng Lớp

PHP
  1. class User
  2. {
  3. public $name = 'MrKen';
  4. public $rights = 9;
  5.  
  6. public function rights()
  7. {
  8. if ($this->rights == 9) {
  9. return 'Quản trị viên';
  10. } else {
  11. return 'Thành viên';
  12. }
  13.  
  14. }
  15. }
  16.  
  17. class Info extends User
  18. {
  19. function getInfo()
  20. {
  21. return $this->name , ' là ' , $this->rights();
  22. }
  23. }
  24.  
  25. $user = new Info;
  26. echo $user->getInfo();

Trong ví dụ trên, class Info là class kế thừa của class User. Do đó từ class Info chúng ta có thể truy cập các thuộc tính và gọi các hàm từ class User.

Từ khóa public, protectedprivate

Khi khai báo hằng, thuộc tính hoặc phương thức (các thành viên) trong lớp, chúng ta phải dùng một trong các từ khóa trên để định nghĩa phạm vi sử dụng cho chúng.

- public: định nghĩa thành viên đó có thể sử dụng ở bất cứ đâu

- protected: định nghĩa thành viên đó có thể sử dụng trong lớp và các lớp kế thừa

- private: định nghĩa thành viên đó chỉ có thể sử dụng trong lớp

PHP
  1. <?php
  2. /**
  3.  * Define MyClass
  4.  */
  5. class MyClass
  6. {
  7. public $public = 'Public';
  8. protected $protected = 'Protected';
  9. private $private = 'Private';
  10.  
  11. function printHello()
  12. {
  13. echo $this->public;
  14. echo $this->protected;
  15. echo $this->private;
  16. }
  17. }
  18.  
  19. $obj = new MyClass();
  20. echo $obj->public; // Hoạt động
  21. echo $obj->protected; // Lỗi
  22. echo $obj->private; // Lỗi
  23. $obj->printHello(); // Hiển thị Public, Protected và Private
  24.  
  25.  
  26. /**
  27.  * Define MyClass2
  28.  */
  29. class MyClass2 extends MyClass
  30. {
  31. // Có thể khai báo lại thuộc tính public và protected, nhưng không thể với private
  32. public $public = 'Public2';
  33. protected $protected = 'Protected2';
  34.  
  35. function printHello()
  36. {
  37. echo $this->public;
  38. echo $this->protected;
  39. echo $this->private;
  40. }
  41. }
  42.  
  43. $obj2 = new MyClass2();
  44. echo $obj2->public; // Hoạt động
  45. echo $obj2->protected; // Lỗi
  46. echo $obj2->private; // Undefined
  47. $obj2->printHello(); // Hiển thị Public2, Protected2, Undefined
Đã chỉnh sửa. MrKen (15.06.2017 / 20:58)
15.06.2017 / 21:38
kayer
Bài đăng: 240
Member
Đã đủ 18 dấu + làm người lớn

Khi nao dung den no the bac ken?

15.06.2017 / 23:17
MrKen
Bài đăng: 2653
Trùm!
Vẫn là A N H

Hiểu đơn giản là sử dụng khi trong code có nhiều hàm (function) hoặc biến có liên quan đến nhau, hoặc được sử dụng lặp lại nhiều lần. Ví dụ:

PHP
  1. class User
  2. {
  3. public $user = false;
  4. public $id = 0;
  5. public $name = null;
  6. public $rights = 0;
  7.  
  8. function __construct($id)
  9. {
  10. $this->__getUser($id);
  11. if ($this->user) {
  12. $this->id = $id;
  13. $this->name = $this->user['name'];
  14. $this->rights = $this->user['rights'];
  15. }
  16. }
  17.  
  18. private function __getUser($id)
  19. {
  20. $query = mysql_query('SELECT `name`, `rights` FROM `users` WHERE `id` = "' . $id . '" LIMIT 1');
  21. if (mysql_num_rows($query)) {
  22. $this->user = mysql_fetch_assoc($query);
  23. }
  24. }
  25.  
  26. public function getName()
  27. {
  28. return $this->name;
  29. }
  30.  
  31. public function getRights()
  32. {
  33. if ($this->rights == 9) {
  34. return 'Quản trị viên';
  35. } else {
  36. return 'Thành viên';
  37. }
  38.  
  39. }
  40. }
  41.  
  42. $id1 = 1;
  43. $user1 = new User($id1);
  44. echo $user1->getName(); // MrKen
  45. echo $user1->getRights(); // Quản trị viên
  46.  
  47. $id2 = 2;
  48. $user2 = new User($id2);
  49. echo $user2->getName(); // BOT
16.06.2017 / 13:06
Jichan
Bài đăng: 1028
Member
Mệt cứ nói, đừng cố....

Thanks bài viết này ạ :-*