Lập trình hướng đối tượng với php 5 nâng cao


tự học php cơ bản 02/09/2015 Cùng chuyên mục

Bài này giới thiệu một số khái niệm nâng cao trong lập trình hướng tượng như: interfaces, abstract, static method, lazyloading...

Biến tĩnh (Stactic propertive)

Như đã biết, một lớp khai báo các thuộc tính. Khi tạo một thể hiện của lớp nó sẽ sao chép các thuộc tính này. Biến tĩnh (stactic propertive) cũng là thuộc tính của lớp nhưng nó chỉ mang ý nghĩa cho riêng lớp đó - không sử dụng các biểu hiện của lớp. Bạn không thể truy cập vào biến tĩnh thông qua một thể hiện của lớp (instance of class).

Để khai báo một biến tĩnh của lớp, sử dụng từ khóa static trước tên biến - mặc định phạm vi truy xuất là public. Để truy cập tới biến tĩnh của lớp, sử dụng cú pháp:
 ::

Hàm tĩnh (static method)

Cũng tương tự như biến tĩnh, bạn có thể khai báo hàm tĩnh trong lớp cùng ý nghĩa như biến tĩnh. Tuy nhiên, hàm tĩnh có thể truy cập được từ thể hiện của lớp. Khai báo một hàm tĩnh theo cú pháp sau:

static  function 
{
	//code
}

Truy cập tới hàm hĩnh hoặc biến tĩnh trong lớp bạn có thể sử dụng từ khóa self thay cho con trỏ $this 

Ví dụ 1: Tạo lớp foo, với biến tĩnh bar, hàm tĩnh baz()

class foo {
	//khai báo biến tính $bar
	static $bar = "bat";
	//khai báo hàm tĩnh baz
	static public function baz($message = 'Hello world')
	{
		self::$bar = $message;
		echo self::$bar;
	}	
}
//tạo một thể hiện của lớp
$foo = new foo();
//truy cập tới hàm tĩnh
$foo->baz();
//truy cập tới biến tĩnh
foo::$bar = "Bien tinh";
print foo::$bar;
//truy cập tới hàm tĩnh trực tiếp
foo::baz("
truy cap ham tinh");

Truy cập tới hàm tĩnh, biến tĩnh từ lớp con

Ở lớp con truy cập tới biến tĩnh, hàm tĩnh của lớp cha sử dụng từ khóa parent.
Ví dụ: Khai báo lớp Nguoi - lớp Nam kế thừa từ lớp người

class Nguoi {
	//khai báo biến tính $bar
	static $tuoi_tho = 80;	
	//khai báo hàm tĩnh baz
	static public function thong_bao()
	{
		echo "Tuoi tho con nguoi: ".self::$tuoi_tho;
	}	
}
class Nam extends Nguoi{
	public function lay_thong_tin()
	{
		//truy cập biến tĩnh của lớp Người
		echo "Tuoi tho nguoi nam it hon ".parent::$tuoi_tho."
"; //truy cập hàm tĩnh từ lớp Người parent::thong_bao(); } } $Binh = new Nam(); $Binh->lay_thong_tin();

 

Interfaces

Interfaces - giao diện cài đặt, còn gọi là mặt nạ cài đặt - xác định kiểu hình chung mà một lớp cần phải có. Các lớp có chung Interfaces là các lớp có "quan hệ" với nhau. Ví dụ, các loại xe ô tô - với mỗi loại xe ô tô như xe 7 chỗ, xe 4 chỗ, xe 32 chỗ...thì các thuộc tính chung của xe ô tô như:

  • Có 4 bánh
  • Sử dụng nhiên liệu
  • Người lái xe phải có giấy phép lái xe,...

Như vậy, khi cài đặt lớp - sẽ tạo nên một vỏ cài đặt chung - còn khi kháo lớp từ vỏ này, sẽ có sự thay đổi về một số chi tiết như xe ô tô sử dụng nhiên liệu xăng hay diesel - kích thước bánh xe, giấy phép lái xe hạng D, B1, B2...

 Để tạo 1 interfaces, sử dụng từ khóa interfaces theo sau là tên - để sử dụng interfaces cho 1 lớp, sử dụng từ khóa implement. Ví dụ:

//khai báo interface Xe_o_to
interface Phuong_tien {
public function kiem_tra_giay_phep();
}
//sử dụng interface Xe_o_to
class Toyota implements Xe_o_to{
	public function chay()
	{
		//
	}
	public function son_vo()
	{
		//
	}	
	public function do_nhien_lieu()
	{
		//
	}
}
//Su dung nhieu interface
class Honda implements Xe_o_to, Phuong_tien{
	public function chay()
	{
		//
	}
	public function son_vo()
	{
		//
	}	
	public function do_nhien_lieu($loai_nhien_lieu)
	{
		//
	}
	public function kiem_tra_giay_phep($hang = 'B2')
	{
		//
	}
}

Sẽ có báo lỗi: Fatal error: Declaration of Honda::do_nhien_lieu() must be compatible with Xe_o_to::do_nhien_lieu() in.. Lý do: ở lớp Honda cài đặt hàm do_nhien_lieu khác giao diện cài đặt chung => tính thống nhất khi sử dụng lớp.

Abstract class:

Hay còn gọi là "lớp trừu tượng" - có chức năng cũng gần như interfaces nhưng điểm khác biệt, đây là một lớp còn interfaces là giao diện cài đặt. Abstract class - định bộ khung giúp gom nhóm các lớp - như nhóm các lớp xe ô tô - còn interfaces là giao diện cài đặt cho các lớp đó. Một chiếc xe ô tô có thể thay đổi vỏ ngoài như màu sơn,... hoặc đã gắn thêm trang phụ kiện khác nhưng phần khung như máy móc thì vẫn giữ nguyên. Cũng như thế, abstract class làm bộ khung và interfaces làm vỏ ngoài.

Lưu ý: Một lớp chỉ có thể kế thừa từ 1 lớp khác - tuy nhiên nó có thể có nhiều giao diện cài đặt.

Để tạo khai báo 1 lớp trừu tượng sử dụng từ khóa abstract trước từ khóa class theo sau là tên - lớp này có thể được kế thừa, lớp trừu tượng sử dụng kết hợp với interfaces sẽ phát huy nhiều tác dụng - đặc biệt là tính thống nhất. Ví dụ: ( 2 interface, đã tạo ở trên - các bạn có thể tự thêm vào)

//khai bao lop ao
abstract class Xe implements Xe_o_to{
	private $lit = 0;
	private $banh_xe = 4;
	public function tieu_hao($lit)
	{
		//
	}
	public function van_toc()
	{
		//
	}
	public function so_banh_xe($banh_xe)
	{
		//
	}
	public function chay()
	{
		//
	}
	public function son_vo()
	{
		//
	}
	public function do_nhien_lieu()
	{
		//
	}
}
//lớp Huyn_dai vừa kế thừa lớp trừ tượng, vừa sử dụng giao diện cài đặt Phuong_tien
class Huyn_dai extends Xe implements Phuong_tien{
	private $lit = 0;
	private $banh_xe = 8;
	public function tieu_hao($lit)
	{
		//
	}
	public function van_toc()
	{
		//
	}
	public function so_banh_xe($banh_xe)
	{
		//
	}
	/*phải có khai báo hàm kiem_tra_giay_phep, do sử dụng giao diện Phuong_tien
	nếu không sẽ báo lỗi*/
	public function kiem_tra_giay_phep()
	{
		//
	}
}
?>

Lazyloading

Khi lập trình hướng đối tượng với php bạn có thể viết riêng mỗi lớp thành 1 file php, khi sử dụng chỉ lần include hoặc require vào đoạn code cần sử dụng. Tuy nhiên, bạn cần phải nhớ tên file. PHP hỗ trợ việc tải lớp 1 cách tự động bằng phương thức __autoload() // lưu ý: __ (2 dấu _, liên tiếp ). Bạn có thể khai báo cho phương thức autoload(), một cấu trúc các file sẽ tải vd: Some_, khi khai báo các lớp như Some_message, Some_register thì sẽ tải file Some_message.php, Some_register.php - Bạn cũng có thể khai báo các cấu trúc khác như C_, khi khai báo lớp có khuôn dạng này sẽ tải các lớp Controller ( do bạn quy định ) hoặc M_ sẽ tải các lớp Model. Lazyloading giúp bạn tiết kiệm công sức và quản lý code tốt hơn. 

Ví dụ: Tạo file Person.php trong thư mục hoc_php/classes - trong đó: classes là thư mục chứa các lớp, Person.php thì Person trùng với tên lớp.

set_name($name);
	}
	public function set_name($name)
	{
		if(!empty($name))
		{
			$this->name = $name;
		}
	}
	public function get_name()
	{
		return $this->name;
	}
	public function set_age($age)
	{
		if(!empty($age))
		{
			$this->age = $age;
		}
	}
	public function get_age()
	{
		return $this->age;
	}
}
?>

File index.php tại thư mục hoc_php ( bạn không cần phải gọi phương thức autoload)

//khai báo phương thức autoload
	function __autoload($class_name)
	{
		//tải file có định dạng .php trong thư mục classes
		require_once $_SERVER["DOCUMENT_ROOT"]."/hoc_php/classes/$class_name.php";
	}
	//tạo lớp Person
	$nam = new Person("Nam");
	echo "".$nam->get_name()."";	

Tổng kết

Với interface - abstract, giúp cho các đối tượng có tính thống nhất và ràng buộc nhau - cũng giúp cho việc phát triển ứng dụng mang tính chất nhóm.


Bài cùng chuyên mục:



Bài liên quan:



Bình luận:


php