-
1 # 碼哥位元
-
2 # 知識邦
面向對像對成員變數修飾三種方式
public:公共的,共有的,公開的
protected:受保護的
private:私有的
三種方式說明:
public、protect、private和extends(繼承)、重寫
# 外部呼叫類內部變數, 只能呼叫public的變數
# 外部呼叫類內部函式, 只能呼叫預設或者public的函式
# 類函式呼叫內部變數沒有限制
# 類函式呼叫內部函式沒有限制
# 透過子類呼叫父類函式, private會報錯, public,protected正常
# 子類呼叫父類變數, private會報錯, public,protected正常
# 子類重寫父類函式,沒限制
# 子類重寫父類函式後,呼叫重寫前的用:parent::XXX();呼叫重寫後的用:self::XXX()或者$this->XXX;
# 繼承父類的普通變數,相當於複製一份變數給子類。 因此重寫不影響父類,也無法訪問父類原本的普通變數。
#繼承父類的靜態變數,子類和父類用同一份變數,若子類修改靜態變數的值(在子類的函式內修改),父類會受影響。
#若子類重寫父類的靜態變數(在子類的函式外,類內修改),相當於父類複製一份靜態變數給子類,此時子類修改靜態變數的值(在子類的函式內修改),父類不受影響。
# 子類重寫父類靜態方法,修改子類靜態變數,父類不受影響;
# 重寫的訪問控制權不能縮小 訪問控制權從大到小排序 public>protected>private
# 非靜態成員不能修改為靜態成員
# 靜態成員不能修改為非靜態成員
-
3 # 雲峰網際網路
成員變數定義為protect和private 同時設定set get方法,對於子類而言的區別是什麼?該問題的答案是:
1.對於protect成員變數而言,子類可以過載方法來訪問和改寫成員變數的值。
2.對於private成員變數而言,子類無法讀取和改寫其值。
回覆列表
在php中,protected和private對於子類的區別是:
對於protected成員變數,子類中使用是不會呼叫__get和__set方法的;
而對於private成員變數,因為無法獲取到私有成員,而走__get和__set方法進行獲取和賦值。
如下有個例子:
class Person
{
protected $name;
private $age;
public function __get($name)
{
var_dump(‘in getter’);
return $this->$name;
}
public function __set($name,$val)
{
var_dump(‘in setter’);
$this->$name = $val;
}
}
class Student extends Person
{
public function foo()
{
$this->name = ‘Mr. Test’;
var_dump($this->name);
$this->age = 8;
var_dump($this->age);
}
}
$test = new Student;
$test->foo();
執行結果如下:
string(8) “Mr. Test”
string(9) “in setter”
string(9) “in getter”
int(8)
其中,第一行輸出是列印name成員的值,第二行輸出是在給age賦值前列印的,第三行是獲取age值前列印的,第四行是age的值。