12/10/2018, 21:44

Lập trình hướng đối tượng ( phần 2)

Các tính chất đặc thù của lập trình hướng đối tượng.

Chào các bạn!

Hôm nay mình sẽ trình bầy một số tính chất của lập trình hướng đối tượng. Nó báo gồm 4 tính chất.

- Tính kế thừa.

- Tính đa hình.

- Tính đóng gói.

- Tính trừu tượng.

1. Tính kế thừa.

Nó cho phép một đối tượng có thể có các đặc tính ( thuộc tính và phương thức) của một đối tượng khác mà không phải định nghĩ lại.

Để kế thùa một class khác ta dùng từ khóa extends

Ví dụ:

class ConNguoi{
	public $ngonTay = 10;
	const chan =2;
	public function an(){
		return 'Đây là phương thức an của lớp con người';
	}
	public function ngu(){
		return 'Đây là phương thức ngủ của con người';
	}
}

class TreCon extends ConNguoi {
	public function bo(){
		return 'Trẻ con bò';
	}

}
$treCon = new TreCon();
dd($treCon->an(),$treCon->ngonTay,TreCon::chan);

Kết quả:

"Đây là phương thức an của lớp con người"
10
2

 

2. Tính đa hình.

Nó được thể hiện qua việc gọi một phương thức. Các phương thức hoàn toàn giống nhau nhưng luồng logic có thể xử lý khác nhau.

 

VD

 

class Hinh{
	public function tinhChuVi(){
	}
}
class HinhVuong extends Hinh{
	private $canh;

	public function setCanh($canh){
		$this->canh = $canh;
	}
	public function getCanh(){
		return $this->canh;
	}
	public function tinhChuVi(){
		return $this->canh*4;
	}
}

class HinhChuNhat extends Hinh{
	private $canhA;
	private $canhB;

	public function setcanhA($canhA){
		$this->canhA = $canhA;
	}
	public function getcanhA(){
		return $this->canhA;
	}

	public function setcanhB($canhB){
		$this->canhB = $canhB;
	}
	public function getcanhB(){
		return $this->canhB;
	}
	public function tinhChuVi(){
		return $this->canhA*$this->canhB*2;
	}

}
$hinhVuong = new HinhVuong();

$hinhVuong->setCanh(2);

dd($hinhChuNhat->tinhChuVi());

$hinhChuNhat = new HinhChuNhat();
$hinhChuNhat->setCanhA(2);
$hinhChuNhat->setCanhB(3);

dd($hinhChuNhat->tinhChuVi());

Qua ví dụ trên cùng là phương thức tính chu vi khi được kế thừa cách tính của phương thức hình vuông khác với phương thức của hình chữ nhật. Đây chính là tính chất đa hình trong lập trình hướng đối tượng.

 

3. Tính đóng gói.

Tính chất này không cho phép người dùng thay đổi trạng thái nội tại của đối tượng. chỉ có phương thức nội tại với thay đổi được nó. Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn, bảo mật của đối tượng,

Trước khi giải thích rõ hơn về phần này. Mình xin nói qua về giới hạn quyền của thuộc tinh và phương thức trong lập trịnh hướng đối tượng.

3.1 private.

Private là giới hạn hẹp nhất của thuộc tính và phương thức trong hướng đối tượng. Khi các thuộc tính và phương thức khai báo với giới hạn này thì các thuộc tính và phương thức đó chỉ có thể sủ dụng trong class đó, bên ngoài không thể nào sử dụng và kế thừa.

VD:

class ConNguoi
{
    //khai báo thuộc tính name ở private
    private $name;

    //Khai báo phương thức run ở private
    private function run()
    {
        return 'Đây là hàm run';
    }

    function setName($name)
    {
        $this->name = $name;
    }

    function getName()
    {
        return $this->name;
    }

    function getRunMethod()
    {
        return $this->run();
    }
}

//Khởi tạo class
$conNguoi = new ConNguoi();
//set thuộc tính name
$conNguoi->setName('Bắp');
//Lấy ra thuộc tính name
echo $conNguoi->getName();
//Gọi giá trị của phương thức run
echo $conNguoi->getRunMethod();

 

class SieuNhan{	
	public function tinhSucManh(){

	}
}
class SieuNhanNhen extends SieuNhan{
	private $sucManh;

	public function setSucManh($sucManh){
		if($sucManh < 0){
			$sucManh = 0;
		}
		$this->sucManh = $sucManh;
	}

	public function getSucManh(){
		return $this->sucManh;
	}
	public function tinhSucManh(){
		return $this->sucManh*4;
	}
}

$nhen = new SieuNhanNhen();
$nhen->setSucManh(-10);
dd($nhen->tinhSucManh());

 

3.2 Protected

Khác với Private một chút thì các phương thức và thuộc tính  của nó được dùng trong class và các class kế thừa nó đêu được sủ dụng.

Vd:

class ConNguoi
{
    //khai báo thuộc tính xe dạng protected
    protected $name;
}

class Man extends ConNguoi
{
    function setName($name)
    {
        //đúng vì sử dụng trong class con
        $this->name = $name;
    }

    function getName()
    {
        //đúng vì sử dụng trong class con
        return $this->name;
    }
}

//khởi tạo lớp ConNguoi
$conNguoi = new ConNguoi();
//Sai vì biến name có visibility là protect nên không tác động từ ngoài class vào được
$conNguoi->name;
//khởi tạo lớp Man
$man = new Man();
//tác động vào biến name qua hàm setName
$man->setName('Bắp');
echo $man->getName();

3.3 Public 

Đây là mức độ truy cập rộng nhất. Nó được sử dụng rộng khắp trong và ngoài class.

Qua quyền truy cập chắc các bạn đã nhận ra được để truy cập đến các thuộc tính hoặc phương thưc kiểu private hoặc protected bên ngoài class là không thể. Bạn muốn tác động đến nó phải thông qua các hàm nó đã được định nghĩa. Cho lên Việc cho phép môi trường bên ngoài tác động lên các dữ liệu nội tại của một đối tượng theo cách nào là hoàn toàn tùy thuộc vào người viết mã. Đây là tính chất đảm bảo sự toàn vẹn, bảo mật của đối tượng

 

 

+2