+4

Nhập môn lập trình hướng đối tượng với PHP (Phần 1)

Trong series này, mình sẽ đi từ cơ bản đến nâng cao về lập trình hướng đối tượng với PHP, mong nhận được phản hồi tích cực từ các bạn 😅.

Trước khi đi vào các bạn cần các kiến thức cơ bản của PHP, nếu chưa bạn có thể tham khảo ở khóa học này tại đây

Trong phần 1 của series này chúng ta sẽ tìm hiểu về:

  • Thế nào là lập trình hướng đối tượng ( OOP)
  • Các đặc trưng cơ bản của của OOP
  • Phân biệt Abstract Class và Interface.
  • Thế nào là một hàm static
  • Phân biệt dùng từ khóa static::method() và self::method()

Lập trình hướng đối tượng là gì? Ưu điểm của nó?

  • Lập trình hướng đối tượng (gọi tắt là OOP - object-oriented programming) là một kĩ thuật công nghệ đối tượng. Nếu trước kia là các kiểu lập trình hướng thủ tục, hướng modun,... thì giờ đây thế giới đang ưu về sử dụng hướng đối tượng. Nếu như trước đây chúng ta lập trình với hướng thủ tục thì sẽ thành các hàm để xử lý, thì giờ đây khi sử dụng hướng đối tượng thì chúng ta sẽ chia thành các đối tượng để xử lý.
  • Vì lập trình hướng đối tượng ra đời sau nên nó khắc phúc được tất cả các điểm yếu của các phuwogn pháp lập trình trước đó. Cụ thể nó có các ưu điểm sau:
    • Dễ dàng quản lý dự án code khi có sự thay đổi chương trình.
    • Dễ mở rộng dự án.
    • Có tính bảo mật cao.
    • Có thể sử dụng mã nguồn, tiết kiệm tài nguyên,

Các đặc điểm cơ bản của lập trình hướng đối tượng.

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

  • Tính chất này không cho phép người dùng trực tiếp tác động đến dữ liệu bên trong đối tượng mà phải thông qua các phương thức mà đối tượng cung cấp. Tính chất này đảm bảo tính toàn vẹn của đối tượng.
  • Trong PHP, có các access modifier như sau:

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

  • Việc bỏ qua hoặc ẩn đi những xử lý phức tạp bên dưới mà chỉ đưa ra các chức năng hoặc tập trung vào các cốt lõi cần thiết được gọi là tính trừu tượng của dữ liệu. Tính trừu tượng còn được thể hiện qua việc một đối tượng ban đầu có thể có 1 số đặc điểm chung cho nhiều đối tượng khác như là sự mở rộng của nó nhưng bản thân đối tượng ban đầu này không có các biện pháp thi hành, tính chất này thường được xác định trong khái niệm gọi là lớp trừu tượng.

  • PHP có class, abstract class, interface để trừu tượng hóa các đối tượng

  • Ví dụ với các hình vuông, hình tròn ta trựu tượng nó lên sẽ thuộc lớp Hình có phương thức tính diện tích:

        class Hinh 
        {
            protected function tinhDienTich()
            {
            }
        }
    

Tính kế thừa (Inheritance)

  • Đặc tính này cho phép một đối tượng có thể có sẵn các đặc tính mà đối tượng khác đã có thông qua kế thừa. Điều này cho phép các đối tượng 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.
  • Trong PHP, một lớp con kế thừa 1 lớp cha thì nó có sẵn các thuộc tính và phương thức được khai báo public hoặc protected của lớp cha.
    • Ta có một ví dụ để hiểu rõ hơn về kế thừa trong PHP
    class ParentClass{
        function getClass()
        {
            return 'ParentClass ';
        }
    }
    
    class ChildClass extends ParentClass{
        var $name = 'ChildClass ';
    
        function getClass()
        {
            return 'ChildClass'; // TODO: Change the autogenerated stub
        }
    
        function getMethod(){
            echo 'Day la phuong thuc cua lop '.$this->getClass();
        }
    
        function getMethodParent(){
            echo 'Day la phuong thuc cua lop '.parent::getClass();
        }
    
    }
    
    $class = new ChildClass();
    $class->getMethod();
    //output: Day la phuong thuc cua lop ChildClass
    $class->getMethodParent();
     //output: Day la phuong thuc cua lop ParentClass
    

Tính đa hình (Polymorphism)

  • Thể hiện qua việc có thể định nghĩa một đặc tính, hoặc phương thức cho một loạt các đối tượng gần nhau khi thực hiện cùng một tên gọi mà sự thực hiện của mỗi đối tượng khác nhau sẽ tự động xảy ra tương ứng theo đặc tính của đối tượng đó mà không nhầm lẫn. Ví dụ: đối tượng "hình vuông" và "hình tròn" có chung 1 phương thức là "tinhDienTich", khi gọi phương thức này thì với mỗi đối tượng sẽ có 1 công thức tính khác nhau.
  • Trong PHP, các lớp con có thể override phương thức của lớp nó kế thừa. Các class cùng implement các interface khác nhau có implement khác nhau cho các method của interface đó. Qua đó phương thức sẽ cho kết quả khác nhau khi được gọi bởi các đối tượng thuộc lớp khác nhau.
  • Ta có ví dụ class HinhTronHinhVuong thực hiện đa hình từ phương thức tinhDienTich() kế thừa từ lớp cha Hinh như sau:
 class HinhVuong extends Hinh {
      private $canh;

      public function setCanh($canh){
          $this->canh = $canh;
      }

       public function getCanh(){
          return $this->canh;
       }

       public  function tinhDienTich()
       {
          return pow($this->canh, 2);
       }
  }

  class HinhTron extends Hinh {
      private $r;

      public function getR()
      {
          return $this->r;
      }


      public function setR($r)
      {
          $this->r = $r;
      }

      public function tinhDienTich()
      {
          return (pow($this->r, 2) * pi());
      }
  }


  $hinhvuong = new HinhVuong();

  $hinhvuong->setCanh(4);

  echo $hinhvuong->tinhDienTich();
  echo '<br>';
  $ht = new HinhTron();
  $ht->setR(3);
  echo $ht->tinhDienTich();
  //output:
  //16
  //28.274333882308

Sự khác biệt giữa Abstract và Interface

Trong phần các tính chất của lập trình hướng đối tượng ta đã đề cập đến tính chất trừu tượng và trong PHP có có class, abstract class, interface để trừu tượng hóa các đối tượng. Vậy làm sao để phân biệt chúng?

  • Abstract Class: được xem như một class cha cho tất cả các Class có cùng bản chất.
  • interface: được xem như một mặt nạ cho tất cả các Class cùng các thức hoạt động nhưng có thể khác nhau về bản chất. Ví dụ:
    • Abstract Class alcohol có các lớp con whisky, wine
    • Abstract Class soda có các lớp con pepsi, sprite
    • Interface gồm có dink, durk. Ta có thể thấy rõ rắng whiskypepsi sẽ có chung là drink nhưng pepsi thì không thể kế thừa Abstract Class alcohol
  • Điểm chung:
    • Không khởi tạo được đối tượng
    • Khai báo phương thức nhưng không thực hiện chúng
    • Được thực thi từ các lớp dẫn xuất
    • Các lớp có thể kế thừa lẫn nhau
  • Khác:
    • Abstract class:
      • Mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa (extend) từ 1 lớp trừu tượng
      • Phương có thể có code hoặc không
      • Định nghĩa cốt lõi cho lớp và sử dụng cho các đối tượng cùng bản chất
      • Có thể khai báo thuộc tính và hằng
      • Các lớp con cần phải thực thi toàn bộ các phương thức abstract method , còn các phương còn lại tùy ý.
    • Interface:
      • Lớp dẫn xuất (lớp con) có thể kế thừa từ nhiều Interface khác nhau để bổ sung cách thức hoạt động của mình
      • Chỉ khai báo phương thức không được định nghĩa chúng
      • Có thể khai báo được hằng nhưng không thể khai báo biến.

Thế nào là một hàm static?

  • Phương thức static là phương thức có thể truy cập mà không cần khởi tạo một đối tượng của Class
  • Đây là những địa chỉ có một, có địa chỉ xác định và không thay đổi địa chỉ trên vũng nhớ (tĩnh)
  • Khi chương trình chạy, nó sẽ được sinh ra đầu tiên trước tất cả các truy cập tới nó và tồn tại cho tới khi chương trình kết thúc.
  • Khai báo một phương thức static trong một class như sau:
     public static function staticMethod()
     {
         //TODO
     }
    

Phân biệt cách dùng từ khóa static::mothod() với self::method()

  • self::method() tham chiếu đến hàm method tại thời điểm nó được định nghĩa.
  • static::method() tham chiếu đến hàm method tại tại thời điểm nó được gọi
  • Ta có ví dụ để hiểu thêm về cách dùng của 2 từ khóa này như sau:
      class A
        {
            public static function test()
            {
                echo 'a';
            }
            public static function run()
            {
                self::test();    // always a
                static::test(); // depend on called class
            }
        }
        
        class B extends A {
        public static function test()
        {
            echo 'b';
        }
    }
    
        A::run(); // output 'aa'
        B::run(); // output 'ab'
    

Tạm kết bài:

Phần 1 của series đến đây là hết, cảm ơn mọi ngừơi đã theo và hẹn gặp lại mọi nguời ở phần 2 với những nội dung:

  • Thế nào là trait?
  • Thế nào là Namespaces?
  • Thế nào là magic functions

All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí