[ST] OOP các kiến thức chung lập trình hướng đối tượng

Các mục thông tin về tin học khác...
Forum rules
Nếu có ý kiến tạo thêm mục kiến thức khác ... Hãy thông báo trong đây ... để được cân nhắc tạo!
Post Reply
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

[ST] OOP các kiến thức chung lập trình hướng đối tượng

Post by tthlan »

Image
Image
Image
Image
Image
Image
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Re: [ST] OOP các kiến thức chung lập trình hướng đối tượng

Post by tthlan »

Sự khác nhau giữa thuộc tính Public, Protected, Private
  • Public: các thuộc tính hoặc các phương thức có thể truy xuất ra bên ngoài class
  • Protected: các thuộc tính các phương thức không thể truy xuất ra bên ngoài class, nó chỉ được gọi trong class và class kế thừa
  • Private: các thuộc tính các phương thức không thể truy xuất ra bên ngoài class, nó chỉ được gọi trong phạm vi class
-----------------
  • Chế độ truy xuất công cộng (Public): Các thành viên nếu được thiết lập ở chế độ này sẽ được nhìn thấy và truy xuất ở mọi nơi trong chương trình.
  • Chế độ truy xuất riêng tư (Private): Các thành viên nếu được thiết lập ở chế độ này sẽ chỉ được nhìn thấy và truy xuất được ở bản thân lớp định nghĩa thành viên đó.
  • Chế độ bảo vệ (Protected): Chế độ này sẽ được dùng để giới hạn truy cập tới các lớp được thừa kế và bản thân lớp định nghĩa thành viên đó.
-----------------

Public:

When you declare a method (function) or a property (variable) as public, those methods and properties can be accessed by:

The same class that declared it.
The classes that inherit the above declared class.
Any foreign elements outside this class can also access those things.

Code: Select all

Example:

<?php
class GrandPa
{
    public $name='Mark Henry';  // A public variable
}

class Daddy extends GrandPa // Inherited class
{
    function displayGrandPaName()
    {
        return $this->name; // The public variable will be available to the inherited class
    }

}

// Inherited class Daddy wants to know Grandpas Name
$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

// Public variables can also be accessed outside of the class!
$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Prints 'Mark Henry'
Protected:

When you declare a method (function) or a property (variable) as protected, those methods and properties can be accessed by

The same class that declared it.
The classes that inherit the above declared class.
Outsider members cannot access those variables. "Outsiders" in the sense that they are not object instances of the declared class itself.

Code: Select all

Example:

<?php
class GrandPa
{
    protected $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Prints 'Mark Henry'

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
The exact error will be this:

PHP Fatal error: Cannot access protected property GrandPa::$name
Private:

When you declare a method (function) or a property (variable) as private, those methods and properties can be accessed by:

The same class that declared it.
Outsider members cannot access those variables. Outsiders in the sense that they are not object instances of the declared class itself and even the classes that inherit the declared class.

Code: Select all

Example:

<?php
class GrandPa
{
    private $name = 'Mark Henry';
}

class Daddy extends GrandPa
{
    function displayGrandPaName()
    {
        return $this->name;
    }

}

$daddy = new Daddy;
echo $daddy->displayGrandPaName(); // Results in a Notice 

$outsiderWantstoKnowGrandpasName = new GrandPa;
echo $outsiderWantstoKnowGrandpasName->name; // Results in a Fatal Error
The exact error messages will be:

Notice: Undefined property: Daddy::$name
Fatal error: Cannot access private property GrandPa::$name
[Sưu tầm] từ internet
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Biến Static

Post by tthlan »

Biến Static trong lập trình PHP

- static được khởi tạo khi chương trình chạy, nên người ta thường dùng nó để gán giá trị mặc định và hay truy xuất đến. Public static thì có giá trị toàn cục (hồi xưa gọi là Global Variable)

- Do được tạo ngay khi chương trình chạy nên khi truy xuất object có từ khóa static thì không cần new object đó lên.

- Không nên lạm dụng quá nhiều static vì sẽ ảnh hưởng đến tốc độ chương trình (do tự động khởi tạo lúc chạy nên chiếm vùng nhớ), mà chỉ sử dụng nếu các biến đó hay object đó thường xuyên được truy xuất.

- Ngược với các biến được khai báo như là các tham số hàm, mà bị hủy khi thoát khỏi hàm, một biến tĩnh sẽ không mất gí trị của nó khi hàm thoát ra và sẽ vẫn giữ giá trị đó nếu hàm đó được gọi lại lần nữa.

Bạn có thể khai báo một biến là biến tĩnh bằng việc đặt từ khóa STATIC ở trước tên biến.

----------------------

– Biến static có thể là global hoặc local. Cả hai đều được khai báo với từ khóa static đi kèm. Truy xuất nhanh, Không cần phải tạo đối tượng (không sợ bị kiểm tra là protected hay private), dùng bất cứ nơi đâu (thường xuyên dùng) .

– Biến local static là biến có thể duy trì giá trị từ lần gọi hàm thứ nhất đến các lần gọi hàm tiếp theo. Biến local static tồn tại đến khi chương trình kết thúc.

– Khi tạo 1 biến local static trong hàm, chúng ta nên khởi tạo giá trị cho chúng. Nếu không giá trị biến được gán mặc định.

– Biến global static là biến global mà chỉ có thể truy cập từ file mà biến đó được định nghĩa.

[Sưu tầm] từ internet
tthlan
Quản trị viên
Posts: 75
Joined: Tue Aug 23, 2016 8:13 am

Phân biệt Interface vs Abstract class trong OOP

Post by tthlan »

Phân biệt Interface và lớp Abstract trong OOP

Interface

Interface là một lớp rỗng chỉ chứa khai báo về tên phương thức không có khai báo về thuộc tính hay thứ gì khác và các phương thức này cũng là rỗng. Bởi vậy bất kỳ lớp nào sử dụng lớp interface đều phải định nghĩa các phương thức đã khai báo ở lớp interface, nếu cố tình không khai báo thì PHP sẽ báo lỗi, để sử dụng lớp interface bạn chỉ việc khai báo với từ khóa implements và một lớp có thể sử dụng nhiều interface cũng như vừa có thể kế thừa từ lớp khác và đồng thời sử dụng interface.

Abstract class

Lớp asbtract cũng gần giống như interface, ngoại trừ nó có thể chứa phương thức và thuộc tính thông thường.

Trong lớp asbtract chứa các phương thức asbtract chúng cũng rỗng giống như phương thức trong interface, vậy nên khi một lớp kế thừa từ lớp asbtract thì bắt buộc phải định nghĩa phương thức đã khai báo ở lớp abstract. ex : abstract public function collectRates(Mage_Shipping_Model_Rate_Request $request);

Một lớp asbtract khi sử dụng cũng như kế thừa bạn khai báo với từ khóa "extends" điều này không giống như interface.

------------------------------------

Interface vs Abstract class in OOP

Hiện nay mặc dù OOP (Object Oriented Programming) đã rất phổ biến nhưng đa số vẫn còn khá mơ hồ trong việc phân biệt và định nghĩa hai khái niệm lớp Interface và Abstract. Bài viết này chúng ta sẽ tìm hiểu kỹ hơn về khái niệm và sự khác biệt giữa chúng, lưu ý ở đây là Abstract Class chứ không phải là Abstract Method nhé!

What is an Abstract Class?

Lớp trừu tượng đơn giản được xem như một class cha cho tất cả các Class có cùng bản chất. Do đó mỗi lớp dẫn xuất (lớp con) chỉ có thể kế thừa từ một lớp trừu tượng. Bên cạnh đó nó không cho phép tạo instance, nghĩa là sẽ không thể tạo được các đối tượng thuộc lớp đó.

What is an Interface?
Lớp này được xem như một mặt nạ cho tất cả các Class cùng cách thức hoạt động nhưng có thể khác nhau về bản chất. Từ đó lớp dẫn xuất có thể kế thừa từ nhiều lớp Interface để bổ sung đầy đủ cách thức hoạt động của mình (đa kế thừa - Multiple inheritance).

Ví dụ:
- Abstract class ConVat có các lớp con Chim, Ca.
- Abstract class MayMoc có các lớp con MayBay, Thuyen
- Interface: iBay, iBoi, iChay.
=> MayBay, Chim sẽ có cùng Interface là iBay. Rõ ràng mặc dù MayBay, Chim có cùng cách thức hoạt động là bay nhưng chúng khác nhau về bản chất.
=> MayBay cũng có interface là iChay nhưng Chim không thể nào kế thừa thêm abstract class MayMoc

Abstract Class vs Interface

Nhìn chung cả 2 đều là "bản thiết kế" cho các lớp dẫn xuất, do đó chúng chỉ chứa các khai báo Properties và Method mà không quan tâm bên trong thực hiện những gì. Nhưng cụ thể thì Abstract Class là "bản thiết kế" cho Class còn Interface là "bản thiết kế" cho Method.
(Ở đây s dùng C# làm ngôn ngữ cho ví dụ)

Code: Select all

//** Ví dụ 1
//** Abstract class
public abstract class Employee
    {
        //Khai báo Properties
        public abstract String ID
        {
            get;
            set;
        }
        //Khai báo Method
        public abstract String Add();
        public abstract String Update();
        
    }
}
//** Interface
public interface IEmployee
    {
        //Khai báo Properties
        String ID
        {
            get;
            set;
        }
        //Khai báo Method
        String Add();
        String Update();
        
    }
}
Do được xem là bản thiết kế cho toàn Class, nên ngoài những khai báo Properties hoặc Method bắt buộc thì Abstarct class vẫn có thể chứa thêm các Method đã được triển khai hoặc các biến hằng. Ngược lại thì Interface hoàn toàn không thể làm được điều đó.

Code: Select all

//** Ví dụ 2
//** Abstract class
public abstract class Employee
    {
        //Khai báo biến hằng (field and constant)
        public String id;
        public String name;
 
        //Khai báo Properties
        public abstract String ID
        {
            get;
            set;
        }
 
        //Khai báo Method
        protected abstract String Add();
        
        //Method đã triển khai không dùng abstract
        public String Update()
        {
            return "Update";
        }
    }
}
//** Interface
public interface IEmployee
    {
        //Khai báo Properties
        String ID
        {
            get;
            set;
        }
        //Khai báo Method
        String Add();
        String Update();
        
    }
}
Toàn bộ những Method và Properties trong Interface không cần khai báo Access modifier vì mặc định là Public. Abstract class thì phải bắt buộc khai báo (Public, Protected) và bắt buộc có từ khóa abstract trong các Method và Properties được khai báo trừu tượng.
1
// Xem ví dụ 2

Một điểm khác biệt nữa là ở lớp dẫn xuất của Interface class bắt buộc phải thực hiện toàn bộ những Method và Properties đã khai báo, ngược lại lớp dẫn xuất của Abstract class chỉ cần thực hiện những Method và Properties được khai báo trừu tượng (có từ khóa abstract)

Code: Select all

//** Sử dụng Abstract class và Interface ở ví dụ 2
//** Lớp dẫn xuất Abstract class
 public class Employee1 : Employee
 {
    //Không cần khai báo lại biến hằng.
 
    //Triển khai Properties với từ khóa override
    public override String ID
    {
       get{ return id; }
       set{ id = value; }
    }
 
    //Triển khai Method với access modifier như ở Abstract class.
    protected override String Add()
    {
        return "Add";
    }
    
    //Không cần triển khai lại Update() mà chỉ việc sử dụng.
 
    // Phần triển khai của Employee1
    ...
 }
 
//** Lớp dẫn xuất Interface
 public class Employee1 : IEmployee
 {
     // Biến hằng được định nghĩa ở đây.
     protected String id;
     protected String name;
 
    // Triển khai Properties
    String ID
    {
       get{ return id; }
       set{ id = value; }
    }
    //Triển khai tất cả các Method có ở Interface
    public String Add()
    {
        return "Add";
    }
    public String Update()
    {
        return "Update";
    }
 
    // Phần triển khai của Employee1
    ...
    
 }
Sự phân biệt này càng rõ ràng hơn với từ khóa implement cho Interface và extend cho Abstract class. Thực vậy, lớp dẫn xuất của Abstract class chỉ là mở rộng (extend) còn Interface thì buộc là thực hiện (implement) tất cả.

[Sưu tầm] từ internet
Post Reply