」工欲善其事,必先利其器。「—孔子《論語.錄靈公》
首頁 > 程式設計 > 了解 PHP OOP 中的存取修飾符:公有、受保護和私有

了解 PHP OOP 中的存取修飾符:公有、受保護和私有

發佈於2024-11-08
瀏覽:956

Understanding Access Modifiers in PHP OOP: Public, Protected, and Private

在 PHP 物件導向程式設計 (OOP) 中,存取修飾符控制類別屬性和方法的可見性。 PHP 中的主要存取修飾符是 public、protected 和 private。

本文將引導您了解這些存取修飾符的目的和用法,並解釋如何在 PHP OOP 中有效地應用它們。

1.公共存取修飾符

  • 關鍵字:公開
  • 可見性:可從任何地方存取-類別內部、類別外部以及衍生類別中。
  • 用例:將 public 用於應可從任何上下文存取的屬性或方法。

例子:

class User {
    public $name = "John";

    public function greet() {
        return "Hello, " . $this->name;
    }
}

$user = new User();
echo $user->greet();  // Output: Hello, John

在此範例中,屬性 $name 和方法greet() 都是公共的,允許從類別外部直接存取它們。

2.受保護的存取修飾符

  • 關鍵字:受保護
  • 可見性:可以在類別本身內部和子類別(子類別)訪問,但不能從類別外部存取。
  • 使用案例:使用 protected 允許衍生類別存取某些屬性或方法,同時保持它們對外部程式碼隱藏。

正確存取的範例:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

class Employee extends Person {
    public function showAge() {
        return $this->getAge();  // Correct: Accesses protected method within a subclass
    }
}

$employee = new Employee();
echo $employee->showAge();  // Output: 30

在此範例中,getAge() 是一種受保護的方法,可以在 Employee 類別(Person 的子類別)中存取該方法。

錯誤範例:

class Person {
    protected $age = 30;

    protected function getAge() {
        return $this->age;
    }
}

$person = new Person();
echo $person->getAge();  // Error: Cannot access protected method Person::getAge()

錯誤訊息:致命錯誤:未捕獲錯誤:無法存取受保護的方法 Person::getAge()

在這種情況下,嘗試直接從 Person 的實例存取受保護的方法 getAge() 會導致錯誤,因為無法從類別外部存取受保護的方法。

3.私有存取修飾符

  • 關鍵字:私有
  • Visibility:只能在定義它的類別中存取。 無法從子類別或外部程式碼存取
  • 使用案例:使用 private 對類別外部的任何程式碼(包括衍生類別)隱藏屬性或方法。

正確存取的範例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }

    public function showBalance() {
        return $this->getBalance();  // Correct: Accesses private method within the same class
    }
}

$account = new BankAccount();
echo $account->showBalance();  // Output: 1000

在此範例中,getBalance() 方法是私有的,因此只能在 BankAccount 類別中存取它。 showBalance() 方法是公用的,可用來間接存取私有 getBalance()。

錯誤範例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

$account = new BankAccount();
echo $account->getBalance();  // Error: Cannot access private method BankAccount::getBalance()

錯誤訊息:致命錯誤:未捕獲錯誤:無法存取私有方法 BankAccount::getBalance()

在這種情況下,嘗試直接從 BankAccount 的實例存取私有方法 getBalance() 會導致錯誤,因為私有方法無法從類別外部存取。

子類別中出現錯誤的範例:

class BankAccount {
    private $balance = 1000;

    private function getBalance() {
        return $this->balance;
    }
}

class SavingsAccount extends BankAccount {
    public function showBalance() {
        return $this->getBalance();  // Error: Cannot access private method BankAccount::getBalance()
    }
}

$savings = new SavingsAccount();
echo $savings->showBalance();

錯誤訊息:致命錯誤:未捕獲錯誤:無法存取私有方法 BankAccount::getBalance()

這裡,私有方法 getBalance() 即使對於像 SavingsAccount 這樣的子類別也是不可存取的,這表明私有方法不能在其定義類別之外存取。

4.存取修飾符總結

修飾符 課堂內 衍生類別 課外
民眾 是的 是的 是的
受保護 是的 是的
私人的 是的

5.最佳實踐

  • 謹慎使用public,僅公開必要的內容。喜歡透過公共方法封裝和公開功能。
  • 使用protected允許子類別存取必要的屬性或方法,同時對外部程式碼隱藏它們。
  • 使用private完全封裝類別內部並防止來自外部或衍生類別的存取。

結論

PHP 的存取修飾符(public、protected、private)提供了一種管理 OOP 中可見性和封裝的機制。透過正確理解和應用這些修飾符,您可以建立更安全且可維護的程式碼。

版本聲明 本文轉載於:https://dev.to/ialaminpro/understanding-access-modifiers-in-php-oop-public-protected-and-private-5bah?1如有侵犯,請聯絡[email protected]刪除
最新教學 更多>
  • 如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何取得 Openpyxl 中單元格的原始值,即使它包含公式?
    如何在Openpyxl 中擷取實際儲存格值使用openpyxl 存取Excel 中的儲存格值時,您可能會遇到顯示的值與儲存在Openpyxl中的實際值之間的差異單元格(如果單元格包含公式)。這是因為 openpyxl 通常會解釋公式並檢索計算結果。 要擷取實際儲存格值(包括公式),可以在載入工作簿時...
    程式設計 發佈於2024-11-08
  • Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    Go 中如何有效率地將 UTF-8 字串轉換為位元組數組?
    將UTF-8 字串轉換為位元組陣列解組JSON 需要位元組切片輸入,而字串在Go 中儲存為UTF-8 。本文探討了 UTF-8 字串到位元組數組的高效轉換。 直接轉換Go 允許將字串轉換為位元組切片,建立字串位元組的副本:s := "some text" b := []byte(...
    程式設計 發佈於2024-11-08
  • 我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    我如何使用 dpdm 修復 Redux 中的循環依賴錯誤
    打破混亂循環:Redux 循環依賴之旅 最近,我在 Redux 程式碼庫中偶然發現了一個讓我摸不著頭緒的錯誤。如果您曾經在測試套件拋出毫無意義的錯誤時感到突然的混亂,您就會知道這種感覺。這是發生的事情以及我最終如何發現(並解決)問題的。 循環依賴到底是什麼? 當兩...
    程式設計 發佈於2024-11-08
  • 我可以在單一 MySQLi 語句中準備多個查詢嗎?
    我可以在單一 MySQLi 語句中準備多個查詢嗎?
    在單一 MySQLi 語句中準備多個查詢不可能在單一 MySQLi 語句中準備多個查詢。每個 mysqli_prepare() 呼叫只能準備一個查詢。 執行多個查詢的替代方法如果您需要一次執行多個查詢,您可以建立並為每個查詢執行單獨的mysqli_prepare() 語句。 $stmtUser = ...
    程式設計 發佈於2024-11-08
  • 在 Golang 中安全使用 Map:宣告和初始化的差異
    在 Golang 中安全使用 Map:宣告和初始化的差異
    介绍 本周,我正在为 golang 开发一个 API 包装器包,它处理发送带有 URL 编码值的 post 请求、设置 cookie 以及所有有趣的东西。但是,当我构建主体时,我使用 url.Value 类型来构建主体,并使用它来添加和设置键值对。然而,我在某些部分遇到了有线零指针...
    程式設計 發佈於2024-11-08
  • 下一個目標
    下一個目標
    我剛剛完成了我的論文,並以令人印象深刻的分數9.1/10,我對此感到非常自豪。提交給 REV-ECIT 2024 的截止日期是 9 月 30 日,目的是將我的論文變成已發表的期刊文章。目前我正在博士生導師的支持下完善我的工作,非常感謝他的指導。 ? 另外,在與SA進行了很長時間的面試後,提出了一...
    程式設計 發佈於2024-11-08
  • Better - 人工智慧驅動的程式碼審查器 GitHub Action
    Better - 人工智慧驅動的程式碼審查器 GitHub Action
    代码审查对于维护标准和强调项目中代码的最佳实践始终至关重要。这不是一篇关于开发人员应该如何审查代码的文章,更多的是关于将一​​部分代码委托给 AI。 正如 Michael Lynch 在他的文章“如何像人类一样进行代码审查”中提到的那样——我们应该让计算机处理代码审查的无聊部分。虽然迈克尔强调格式化...
    程式設計 發佈於2024-11-08
  • 如何使用 Java 8 有效統計列表中的詞頻?
    如何使用 Java 8 有效統計列表中的詞頻?
    使用 Java 8 計算詞頻在 Web 開發和資料分析中,理解詞頻至關重要。為了實現這一目標,我們將深入研究如何使用 Java 8 計算清單中單字的頻率。 Java 8 解決方案Java 8 中的 Stream API 為單字提供了一個優雅的解決方案頻率計數。首先,建立一個單字清單:List<...
    程式設計 發佈於2024-11-08
  • 什麼是封裝以及如何使用它。
    什麼是封裝以及如何使用它。
    什麼是封裝? Java 中的封裝就是隱藏某些東西如何運作的細節,同時仍然允許其他人使用它。您將資料(如變數)和方法(如函數)分組到一個單元中,稱為類別。您不是讓每個人都直接存取您的數據,而是提供方法(getter 和 setter)來控制數據的存取或更改方式。這樣,您可以保護您的資料並保持程式碼整...
    程式設計 發佈於2024-11-08
  • Java 中的倒置二元樹
    Java 中的倒置二元樹
    最近,我開始練習一些 LeetCode 練習,以提高我的演算法/資料結構技能。我可以說,該平台提供了一個良好的環境,可以與其他開發人員一起練習和學習多種程式語言的解決方案,與他人討論、分享解決方案,並練習大公司要求的程式碼挑戰。 什麼是 LeetCode? LeetCode 是一個...
    程式設計 發佈於2024-11-08
  • 如何在Python中高效率找出一個數的因數?
    如何在Python中高效率找出一個數的因數?
    在Python 中高效查找數字的因數確定數字的因數是各個領域中的常見任務,Python 提供了多種有效的方法來完成它。 一種最佳化方法涉及利用 Python 的 reduce 函數以及列表理解。這個簡潔的解決方案有效地找到給定數字的所有因子。 from functools import reduce...
    程式設計 發佈於2024-11-08
  • JavaScript 困境:嵌入腳本與內嵌執行?
    JavaScript 困境:嵌入腳本與內嵌執行?
    外部腳本標籤中的JavaScript:來源困境當使用帶有 的外部腳本標籤時語法,了解它們的限制很重要。嘗試將 JavaScript 直接嵌入到這些標記中(如下例所示)會導致意外行為:<script src="myFile.js"> alert("Th...
    程式設計 發佈於2024-11-08
  • 屬性 Hooks 無 PHP
    屬性 Hooks 無 PHP
    11 月,我們將推出我們心愛的 PHP 8.4 版本,隨之而來的是社區期待已久的新功能:屬性掛鉤!受到 C#、Swift 和 Kotlin 等其他語言的啟發,這個新功能消除了魔法方法 __set() 和 __get() 的麻煩。 我將展示一個範例,說明目前如何擁有 getter 和 setter,...
    程式設計 發佈於2024-11-08
  • 如何在不阻塞伺服器和客戶端的情況下即時讀取和回顯伺服器目前正在寫入的上傳檔案大小?
    如何在不阻塞伺服器和客戶端的情況下即時讀取和回顯伺服器目前正在寫入的上傳檔案大小?
    如何在不阻塞伺服器和客戶端的情況下,即時讀取和列印正在伺服器端寫入的上傳檔案的大小? 讓我們展開來討論這個問題:為了即時取得文件上傳的進度,我們在POST 請求中透過fetch() 從Blob、File、TypedArray 或ArrayBuffer 物件設定了body 物件。 目前的實作將 Fil...
    程式設計 發佈於2024-11-08
  • 如何在 Python 中確定閏年:綜合指南
    如何在 Python 中確定閏年:綜合指南
    使用 Python 計算閏年來確定某一年是否為閏年涉及可以透過程式評估的特定標準。閏年可以四整除,但能被一百但不能被四百整除的年份除外。 解決此問題的一個潛在方法是實作一個自訂函數來檢查閏年。但是,當嘗試使用此類函數時,您可能會遇到模組傳回 None 而不是所需輸出的問題。 更強大、更全面的解決方案...
    程式設計 發佈於2024-11-08

免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。

Copyright© 2022 湘ICP备2022001581号-3