Public vs Private vs Protected,PHP 存取修飾符解析

private way, private, sign

PHP 存取修飾符(Access Modifiers)包括 public、private 和 protected,主要目的是管理類別內部的屬性和方法的可訪問性。通過這些修飾符,開發者能確保數據的安全性和程式的穩健性。

Public (公開)

在 PHP 中,public 是一個存取修飾符,用於定義類別(class)的屬性和方法的可見性。當一個屬性或方法被標記為 public,這表示它可以在任何地方被存取,包括該類別之外。

使用 public 的主要理由是你想讓這個屬性或方法能夠被任何人(其他類別和程式碼)訪問和修改。這裡有一些常見的使用情境:

使用 public 的理由

共用功能:

如果你有一個函數或變數,你希望在多個不同的地方都能使用,那麼把它設成 public 是有用的。

簡單性:

使用 public 會讓你的程式碼更簡單,更容易理解。因為你不需要寫額外的函數來讀取或更改這個變數。

與外部互動:

當你的類別需要與外部世界(比如用戶輸入或其他類別)互動時,使用 public 可以直接地讓外部存取這個類別的特定部分。

擴展和維護:

如果這個屬性或方法可能在未來被其他開發者或者其他類別所需要,設它為 public 可以讓其他人更容易地擴展和維護程式。

減少冗餘:

當多個類別需要同樣的功能或數據時,把這個功能或數據設為 public 可以避免重複的程式碼。

小提醒

請注意,過度使用 public 可能會帶來一些風險,比如很容易破壞資料的完整性,所以要謹慎使用。

公開程式範例

// 定義一個 Animal 類別
class Animal {
    // 使用 public 修飾符定義一個屬性
    public $name;

    // 使用 public 修飾符定義一個方法
    public function makeSound() {
        return "Some generic animal sound";
    }
}

// 建立一個 Animal 類別的實例
$animal = new Animal();

// 存取 public 屬性
$animal->name = "Dog";

// 存取 public 方法
echo $animal->makeSound(); // 輸出:Some generic animal sound

當您希望某個方法或屬性可以從類別之外被存取,或者有一個 API 或接口,希望其他程式碼可以自由使用時,public 是個好選項。

Private (私有)

private 是一種存取修飾符,用於限制類別屬性或方法只能在該類別內部被存取。

使用 private 的理由

使用 private 的主要目的是將類別的特定部分隱藏起來,只讓這個類別自己能夠訪問或修改它們。這樣做有幾個好處:

資料安全性:

把一個屬性或方法設為 private 可以保護它不會被外部不應該的訪問或修改。

降低複雜性:

使用 private 可以讓你更清楚地知道哪些功能是僅供類別內部使用的。這樣,其他開發者就不會意外地修改這些部分。

易於維護:

因為 private 屬性或方法只在類別內部使用,如果需要改變它們,你只需要查看這個類別的程式碼,不用擔心會影響到其他地方。

實施封裝(Encapsulation):

將內部的實現細節隱藏起來,並只暴露出有限的、必要的接口,是物件導向編程的一個重要原則。

增加可重用性:

當你的程式碼只依賴於類別的公開接口,而不依賴於內部的 private 實現,你會發現更容易在其他地方重用這個類別。

private 修飾符有助於保護數據,簡化複雜性,並提高程式的可維護性和可重用性。

私有範例

// 定義一個 Person 類別
class Person {
    // 使用 private 修飾符定義一個屬性
    private $age;

    // 使用 public 修飾符定義一個方法來設定 age
    public function setAge($value) {
        if ($value > 0) {
            $this->age = $value;
        }
    }

    // 使用 public 修飾符定義一個方法來獲取 age
    public function getAge() {
        return $this->age;
    }
}

// 建立一個 Person 類別的實例
$person = new Person();

// 透過 public 方法設定 age
$person->setAge(25);

// 透過 public 方法獲取 age
echo $person->getAge(); // 輸出:25

當您希望封裝某些類別的內部邏輯,或不希望外部程式碼直接更改類別的內部狀態時,prviate 是個好選擇。

小提示

如果內心猶豫不決,那就由 private 開始,讓需求自然進入 public。

Protected (受保護)

protected 是一個存取修飾符,表示這些屬性和方法只能在該類別及其子類別中被存取。

使用 protected 的理由

使用 protected 的主要理由是為了在限制一些訪問的同時,還能保留一定程度的靈活性。以下是幾個為什麼你可能會想用 protected 的情況:

繼承與擴展:

當你有一個類別(我們可以把它想像成一個「父親」玩具箱)和這個類別的子類別(就像「孩子」玩具箱),你可能會想要有些玩具只能由這一家人使用,而不能由外面的人使用。在這種情況下,protected 就很有用。

安全性與可控性:

使用 protected 修飾符表示你不希望其他無關的類別,直接訪問這個屬性或方法,但你又希望子類別能有一些更多的操作空間。

模組化設計:

當你設計一個可擴展的系統,你可能會想用 protected 來定義一些可以由子類別修改或擴展的核心行為。

代碼重用:

有時候多個類別需要共用一些相似的功能。透過使用 protected,子類別可以繼承並使用這些功能,而無需重新寫代碼。

增加代碼的組織性:

使用 protected 可以幫助你更清晰地劃分哪些功能是基礎功能,應該由所有子類別共享,以及哪些功能是只應該由特定類別使用的。

更好的團隊合作:

當一個大的開發團隊在一個大型專案上工作時,使用 protected 可以幫助每個開發者更清楚地了解他們應該和不應該修改哪些代碼。

protected 提供了一種平衡,允許你在保護數據和提供某種程度的靈活性之間找到一個中間點。這對於建立穩健和可擴展的物件導向程序是非常有用的。

受保護範例

// 定義一個基礎類別 ParentClass
class ParentClass {
    // 使用 protected 修飾符定義一個屬性
    protected $value = "I'm a protected value";

    // 使用 protected 修飾符定義一個方法
    protected function showValue() {
        return $this->value;
    }
}

// 定義一個從 ParentClass 繼承的子類別
class ChildClass extends ParentClass {
    // 使用 public 修飾符定義一個方法來顯示 protected 的屬性和方法
    public function reveal() {
        echo $this->value; // 可存取
        echo $this->showValue(); // 可存取
    }
}

// 建立一個 ChildClass 類別的實例
$child = new ChildClass();

// 使用 public 方法來顯示 protected 的屬性和方法
$child->reveal(); // 輸出:I'm a protected valueI'm a protected value

當您希望某些屬性或方法,只能被同一繼承體系的子類別使用,同時不被外人所知,protected 非常適合這個工作。

最後

總結以上,您能學習到 PHP 中有關 publicprivateprotected 的基本概念和使用情境,這些知識會加強對於資料封裝的感覺,可以自然而然的產生功能緊密的物件,又能同時保持健壯的類別。

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *