PHP 區別 public private protected

PHP different between public, private and protected

作者: 七味粉 |
文章2013-05-06
55 分享
169
我們先簡單用文字介紹一下,public private protected 這三個有什麼區別
首先這三個詞彙(關鍵字)通常會出現在類別裡面「成員 (Member)」「方法 (Method)」的前面,是一種存取修飾詞(access modifier),他們定義了這個「成員」或者「方法」的存取範圍


搞不懂~?沒關係,我們舉例!


假設我們建立一個「學生」的類別,並且創造一個物件叫做「王小明」,而每個「學生」都擁有自己的「姓名」及「學號」,而「姓名」是公開的~好比繡在制服上一樣,而「學號」我們暫時定義為「私人」的,只有透過詢問這個學生,他才會告訴你~


class Student
{
public $Name;
private $StudentID;
public function __construct($inputName, $inputID)
{
$this->Name = $inputName;
$this->StudentID = $inputID;
}
public function WhatisYourID()
{
echo "My StudentID is $this->StudentID";
}
}
$tempStudent = new Student("Wang", "A12234");
$tempStudent->WhatisYourID();
echo "This student's name is $tempStudent->Name";

我們創見了一個學生的類別,並產生一個暫時的物件 $tempStudent ,並且指定他的名字為 Wang 、學號為 A12234
而這個學生的類別,將它的 Name 設為 public ,而他的 StudentID 設為 private
這代表當我使用這個物件的時候,到底可不可以直接存取 Name 或者 StudentID


上面的例子,我們可以直接使用 $tempStudent->Name 來拿到學生的姓名,但是如果你想要用 $tempStudent->StudentID,你就會得到一個錯誤訊息
Cannot access private property Student::$StudentID



它的意思就是跟你說,你的 StudentID 的存取範圍設置為 (private) 所以不可以直接透過物件來存取StudentID,反而 Name 我們設置為 public ,這樣就可以直接透過物件來直接存取Name。


那我們到底要怎麼樣拿到 StudentID ?? 你會發現到我們有做一個函式 WhatisYourID ,而這個函式裡面使用了 StudentID ,而我們透過使用這樣一個函式,來拿到這個學生的StudentID。


所以簡單來說,設置為 private 時,只有在 class 裡面可以存取,而設置 public 時,不管是 class 裡面、或者透過這個 class 所產生的物件,都可以直接存取。


那 protected 又是什麼?protected 主要用途是出現在「繼承」的行為出現時,才會用到。所以如果你根本沒有「繼承」的行為出現時,基本上是用不到 protected 的。
而 protected 的存取範圍又是什麼?當你一個「成員」或者「方法」設置為 protected 時,除了類別本身一定能夠存取外,還允許繼承這個類別的類別可以使用。
protected 跟 private 很像,基本上都是「不公開使用」,只有「類別」本身可以使用,額外小小的差異就是,protected 允許繼承它的類別可以使用
舉個例子~


class Car
{
private $Engine;
protected $Wheel;

public function __construct()
{
}
}
class Toyota extends Car
{
private $Color;
public function __construct()
{
}
}

上面這個例子,有一個類別叫做 Car,另外有一個Toyota 的類別繼承了Car,用簡單的話語來講就好像是Car是爸爸,Toyota是兒子,而爸爸允許兒子可以使用輪子,但是不准他用引擎。
有人會問說,為什麼這麼麻煩,全部都設置 public 不就好了? 當然~設置這些對於寫PHP來說,好像沒有影響,反而你好像可以不用去管這麼多。但是~偏偏就是程式碼越寫越多時,要是一開始沒有一個良好的寫程式習慣,沒有定義清楚這些存取範圍,當bug出現時,你可能連在哪邊出錯你都不知道。網路上很多的範例檔,根本是不管這些存取修飾詞的,但是我認為這不是一個良好的程式設計習慣,最好是從基礎就要把這些功夫做足來,你要發展大型的功能或者案子時,才不會花太多時間在找根本不知道哪裡錯的bug。
貼心小提醒
1.您目前未登入,若於此狀態進行文章收藏,紀錄可能無法長期保留。
2.建議登入後進行收藏,好文會幫你保存著,隨時要看也不怕找不到唷~

KiKiNote持續為您提供最優質的資訊內容,謝謝您!
不再顯示此視窗

複製成功