Ví dụ tính trừu tượng php

1. Lớp trừu tượng abstract

Nếu bạn đã từng học qua lập trình hướng đối tượng một ngôn ngữ bất kỳ khác như C++, Java thì abstract khá quen thuộc, và trong php đây cũng là một tính chất của lập trình hướng đối tượng nhưng nó không được xếp vào tính chất quan trọng, tính chất này giống như tính kế thừa theo tầm nhìn bề ngoài. Lớp Abstract sẽ định nghĩa các hàm (phương thức) mà từ đó các lớp con sẽ kế thừa nó và Overwrite lại (tính đa hình). Tất cả các phương thức của lớp abstract đều phải được khai báo là abstract và phải ở mức protected và public, không được ở mức private. Lớp Abstract có thể có thuộc tính nhưng thuộc tính không được khai báo là abstract, và bạn không thể khởi tạo một biến của lớp Abstract được.

Ví dụ tính trừu tượng php

Ví dụ tính trừu tượng php

Bài viết này được đăng tại freetuts.net, không được copy dưới mọi hình thức.

Để khai báo một lớp Abstract ta dùng cú pháp sau:

abstract class BaseClass
{
    // phương thức ở mức protected
    abstract protected function hello();
 
    // Phương thức ở mức public
    abstract public function hi();
}

Trong lớp Abstract các phương thức bạn khai báo ở dạng Abstract đều phải tuân theo cú pháp trên, tức là bạn không được định nghĩa thêm dòng lệnh nào bên trong nó. Như ví dụ dưới này là sai.

abstract class BaseClass
{
    // Phương thức này sai vì hàm hello là
    // hàm abstract nên không được code bên trong nó
    abstract protected function hello()
    {
        // dòng code
        echo 1;
    }
 
}

Như tôi nói ở trên bạn không thể tạo một biến đối tượng mới của lớp Abstract, như ví dụ dưới này là sai:

abstract class BaseClass
{
    abstract protected function hello();
}
 
// Sai vì BaseClass là lớp Abstract nên không
// khởi tạo mới được
$base = new BaseClass();

Mức truy cập các hàm của Abstract phải ở public hoặc protected để lớp kế thừa có thể định nghĩa lại và các thuộc tính của lớp Abstract không được khai báo Abstract. Các bạn xem ví dụ dưới đây:

abstract class BaseClass
{
    // Đúng
    public $name;
 
    // Sai vì các thuộc tính không được để ở dạng abstract
    abstract public $title;
 
    // Đúng
    abstract protected function hello();
 
    // Sai vì hàm abstract không thể ở private
    abstract private function hi_there();
}

Lớp kế thừa từ lớp Abstracth phải Rewrite lại tất cả các hàm Abstract trong lớp Abstract, nếu không sẽ bị báo sai. Ví dụ:

abstract class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
 
    abstract public function showInfo();
}
 
// Lớp này sai vì chưa viết lại hàm showInfo
class CongNhan extends Person
{
 
}
 
// Lớp này đúng vì ta đã khai báo, viết lại
// đầy đủ các hàm abstract
class SinhVien extends Person
{
    public function showInfo(){
 
    }
}

2. Hàm và lớp final

Lớp Final là lớp được khai báo là lớp cuối cùng, không một lớp nào có thể kế thừa nó. Tương tự như hàm Final trong Abstract hoặc trong kế thừa chỉ để gọi sử dụng, không được viết lại (Override).  Để dễ hình dung các bạn xem ví dụ sau đây và thông qua phần ghi chú tôi đã giải thích.
Ví dụ lớp final:

// Lớp Filnal
final class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
    public function showInfo()
    {
        echo 'freetuts.net';
    }
}
 
// Hàm này sẽ bị báo lỗi vì lớp SinhVien
// đã kế thừa một lớp Final, điều này là không thể
class SinhVien extends Person {
}
 
// Đoạn code này đúng vì lớp Final được
// sử dụng bình thường như các lớp khác
// chỉ có điều là không được kế thừa
$person = new Person;
$person->showInfo();

Ví dụ hàm final:

class Person
{
    protected $ten;
    protected $cmnd;
    protected $namsinh;
    final public function showInfo()
    {
        echo 'freetuts.net';
    }
}
 
// Lớp này đúng vì lớp Person không phải
// là một lớp final
class SinhVien extends Person {
 
    // Hàm này sai vì hàm showInfo
    // là hàm final trong lớp Person
    // nên không thể Override lại
    public function showInfo(){
 
    }
 
    public function Go()
    {
        // Đoạn code này đúng vì hàm final được
        // sử dụng bình thường
        $this->showInfo();
    }
}

3. Lời kết

Trong bài này chúng ta đã tìm hiểu được thế nào là lớp Abstract (lớp trừu tượng) và từ khóa Final trong php. Qua bài này tôi hy vọng các bạn hiểu được bốn tính chất của lập trình hướng đối tượng mà bất kỳ một ngôn ngữ nào khác đều phải tuân theo quy luật này. Nếu bạn thấy một ngôn ngữ nào mà không có đầy đủ bốn tính chất này thì ngôn ngữ đó không phải là ngôn ngữ có hỗ trợ lập trình hướng đối tượng (như Javascript). Bài tiếp theo chúng ta sẽ tìm hiểu Interface Trong PHP

Lập trình hướng đối tượng (oop) hiện nay đang là  một kĩ thuật rất quang trọng cho dân lập trình, không chỉ riêng ngôn ngữ php mà còn áp dụng cho rất nhiều ngôn ngữ khác, bài viết sau đây sẽ giúp chúng ta biết tổng qua được hướng đối tượng là gì và những tính chất của nó.

Hướng đối tượng là gì 

đây là một kỹ thuật lập trình cho phép lập trình viên tạo ra các đối tượng trong code trừu tượng hóa các đối tượng thực tế trong cuộc sống. Hướng tiếp cận này hiện đang rất thành công và đã trở thành một trong những khuôn mẫu phát triển phần mềm, đặc biệt là các phần mềm cho doanh nghiệp.

4 Tính chất của hướng đối tượng

Ví dụ tính trừu tượng php

Ví dụ tính trừu tượng php

Học Tiếng Anh với Thầy giáo Nổi tiếng Việt Nam và thế giới, Chuẩn Quốc Tế, Giá Rẻ, Click Ngay
 

Học Tiếng Anh với Thầy giáo Nổi tiếng Việt Nam và thế giới, Chuẩn Quốc Tế, Giá Rẻ, Click Ngay
 

Tính thừa kế:

Lớp cha có thể chia sẻ dữ liệu và phương thức cho các lớp con, các lớp con khỏi phải định nghĩa lại những logic chung, giúp chương trình ngắn gọn. Nếu lớp cha là interface, thì lớp con sẽ di truyền những contract trừu tượng từ lớp cha.

Để hiểu rõ hơn về tính kế thừa trong PHP bạn có thể tham khảo bài viết TÍNH KẾ THỪA TRONG PHP

Tính đóng gói (encapsulation):


Tức là trạng thái của đối tượng được bảo vệ không cho các truy cập từ code bên ngoài như thay đổi trong thái hay nhìn trực tiếp. 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ã, tính đóng gói được thể hiện thông qua phạm vi truy cập (visibility). Ngoài ra, các lớp liên quan đến nhau có thể được gom chung lại thành package.
 Ví dụ về các từ khóa  visility trước các phương thức và thuộc tính như

- Public: Đây là mức truy cập thoáng nhất bởi vì bạn có thể truy cập tới các phương thức và thuộc tính ở bất cứ đâu, dù trong nộ bộ của lớp hay ở lớp con hay cả bên ngoài lớp đều được.

- Protected: chỉ cho phép truy xuất nội bộ trong lớp đó và lớp kế thừa, riêng ở bên ngoài lớp sẽ không truy xuất đc

- Private: Đây là thành phần chỉ dành riêng cho nội bộ của lớp, nghĩa là ta không thể truy xuất tới thành phần private ở lớp con hoặc ở bên ngoài lớp.
Tính kế thừa là khả năng cho phép ta xây dựng một lớp mới dựa trên các định nghĩa của một lớp đã có. Lớp đã có gọi là lớp Cha, lớp mới phát sinh gọi là lớp Con và đương nhiên kế thừa tất cả các thành phần của lớp Cha, có thể chia sẻ hay mở rộng các đặc tính sẵn có mà không phải tiến hành định nghĩa lại.

Tính trừu tượng (abstraction):


Tính trừu tượng là một tiến trình ẩn các chi tiết trình triển khai và chỉ hiển thị tính năng tới người dùng. Tính trừu tượng cho phép bạn loại bỏ tính chất phức tạp của đối tượng bằng cách chỉ đưa ra các thuộc tính và phương thức cần thiết của đối tượng trong lập trình.


Ví dụ điển hình của chúng là sử dụng abstract class và interface để có tính trừu tượng.

Để hiểu hơn về tính từu tượng, các bạn có thể tham khảo bài viết so sánh Abstract Class và Interface

Tính đa hình (polymorphism):

Có thể thực hiện nhiều nhiệm vụ khác nhau, có thể tùy biến khi sử dụng cùng một đoạn code


Đối với tính chất này, nó được thể hiện rõ nhất qua việc gọi phương thức của đối tượng. Các phương thức hoàn toàn có thể giống nhau, nhưng việc xử lý luồng có thể khác nhau. Nói cách khác: Tính đa hình cung cấp khả năng cho phép người lập trình gọi trước một phương thức của đối tượng, tuy chưa xác định đối tượng có phương thức muốn gọi hay không. Đến khi thực hiện (run-time), chương trình mới xác định được đối tượng và gọi phương thức tương ứng của đối tượng đó. Kết nối trễ giúp chương trình được uyển chuyển hơn, chỉ yêu cầu đối tượng cung cấp đúng phương thức cần thiết là đủ.


chúng ta  có thể sử dụng nạp chồng phương thức (method overloading) và ghi đè phương thức (method overriding) để có tính đa hình.


Nạp chồng (Overloading): Đây là khả năng cho phép một lớp có nhiều thuộc tính, phương thức cùng tên nhưng với các tham số khác nhau về loại cũng như về số lượng. Khi được gọi, dựa vào tham số truyền vào, phương thức tương ứng sẽ được thực hiện.


Ghi đè (Overriding): là hai phương thức cùng tên, cùng tham số, cùng kiểu trả về nhưng thằng con viết lại và dùng theo cách của nó, và xuất hiện ở lớp cha và tiếp tục xuất hiện ở lớp con. Khi dùng override, lúc thực thi, nếu lớp Con không có phương thức riêng, phương thức của lớp Cha sẽ được gọi, ngược lại nếu có, phương thức của lớp Con được gọi.

xem thêm bài viết: phân biệt lớp và đối tượng trong lập trình hướng đối tượng với php

Bài viết này chỉ giới thiệu sơ qua về hướng đối tượng và những tính chất của nó, mạng nặng tính lý thuyết, vì thời gian có hạn nên chúng tôi sẽ cung cấp những ví dụ cụ thể và chi tiết hơn trong những phần tiếp theo, mời độc giả đón đọc

Bài viết này được lấy nguồn tham khảo từ viblo.asia:https://viblo.asia/p/tim-hieu-ve-lap-trinh-huong-doi-tuong-object-oriented-programming-bxjvZwlBGJZ và freetuts.net: https://viblo.asia/p/4-tinh-chat-cua-lap-trinh-huong-doi-tuong-trong-java-bJzKmMjPK9N trong một sô đoạn văn