Khái quát

Hướng đối tượng trong PHP

Từ PHP 5, ngôn ngữ này đã giới thiệu đầy đủ các tính năng của lập trình hướng đối tượng. Một số tính năng bao gồm:

  • abtract class, interface
  • phương thức và lớp final
  • phương thức public, private, protected
  • phương thức magic, cloning

Giới thiệu class (lớp)

Class được định nghĩa gồm từ khóa class theo sau đó là tên class, cùng với cặp ngoặc nhọn. Bên trong class chứa nội dung bao gồm hằng số, biến (hay còn gọi là thuộc tính) và hàm (hay còn gọi là phương thức).
Biến $this biểu thị cho object hiện tại của class đó.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
<?php
class SimpleClass {
  // khai báo thuộc tính
  public $var = 'giá trị mặc định';

  // khai báo phương thức sử dụng biến $thís
  public function displayVar() {
    echo $this->var;
  }
}

// tương đương với $object = new SimpleClass
$object = new SimpleClass(); 
$object->displayVar(); // -> 'giá trị mặc định'

PHP đối xử với object như tham chiếu chứ không phải tạo một đối tượng mới. Mỗi khi tạo đối tượng mới thì chúng ta phải dùng từ khóa new.

Ví dụ dưới đây thay đổi giá trị của biến mà không cần dùng biến tham chiếu & trong hàm changeValue. Vì mặc định biến $object đã là một tham chiếu. Tính chất này cũng đúng trong các ngôn ngữ bậc cao khác như Javascript.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
class SimpleClass {
  public $var = 'giá trị mặc định';
}
$object = new SimpleClass;

function changeValue(SimpleClass $s) {
  $s->var = 'giá trị đã thay đổi';
} 
changeValue($object);
echo $object->var; // -> 'giá trị đã thay đổi'

Từ khóa new

Để tạo một đối tượng từ class, hãy sử dụng từ khóa new. Từ khóa new sẽ gọi contructor của class. Nếu không có tham số của contructor (hàm tạo) thì có thể bỏ qua dấu ().

Để truy cập phương thức sử dụng $tên_object->phương_thức (không có dấu $ trước phương thức). Tương tự cũng không sử dụng $ với tên hàm.

Hàm __destruct sẽ được gọi nếu đối tượng không có biến nào tham chiếu tới nữa hoặc chương trình kết thúc giống như ngôn ngữ C++.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
<?php
class SimpleClass {
  public $var;
  public function __construct($str = "giá trị mặc định\n") {
    $this->var = $str;
  }
  public function __destruct() {
    echo 'destruct is call';
  }
}
$object1 = new SimpleClass();
$object2 = new SimpleClass('Chào thế giới');

echo $object1->var; // -> giá trị mặc định
echo $object2->var; // -> Chào thế giới

Cũng có thể tạo đối tượng dựa trên string chứa tên class.

1
2
3
4
5
6
<?php
$instance = new SimpleClass();

// Tạo tên lớp dựa trên string
$className = 'SimpleClass';
$instance = new $className(); // new SimpleClass()

Giống như tạo hàm không tên chúng ta còn có thể tạo class không tên từ phiên bản PHP 7.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
class Util {
  private $logger;
  public function setLogger(object $logger) {
    $this->logger = $logger;
  }
  public function printLog(string $msg) {
    $this->logger->log($msg);
  }
}

$util = new Util();

// tạo class không tên là tham số của hàm
$util->setLogger(new class {
  public function log($msg) {
    echo $msg;
  }
});
$util->printLog("Sample log"); // -> Sample log

Class thừa kế class với từ khóa extends

Thừa kế trong PHP là đơn thừa kế, có nghĩa là một lớp chỉ được thừa kế duy nhất một lớp khác. Class thừa kế có thể ghi đè phương thức và thuộc tính của class cha. Khi class cha định nghĩa lớp hoặc phương thức với từ khóa final tức là nó không được ghi đè nữa. Class con muốn truy cập class cha thì sử dụng từ khóa parent::.

Phương thức mà không định nghĩa từ khóa public, private hay protected có nghĩa đó là phương thức public.

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
class SimpleClass {
  public $var = 'giá trị mặc định';
  public function displayVar() {
    echo $this->var;
  }
}

class ExtendClass extends SimpleClass {
  // Định nghĩa lại phương thức displayVar
  // không có từ khóa public hay private/protected thì
  // đây là hàm public
  function displayVar() {
    echo "Lớp thừa kế \n";
    parent::displayVar(); // gọi phương thức cha
  }
}

$extended = new ExtendClass();
$extended->displayVar(); // Lớp thừa kế \n giá trị mặc định

::class

Từ phiên bản PHP 5.5 có thể lấy tên class đầy đủ bằng sử dụng ::class. Tên class đầy đủ là tên chứa cả namespace.

1
2
3
4
5
6
<?php
namespace NS {
  class ClassName {}
  
  echo ClassName::class; // -> NS\ClassName
}