封裝 繼承 多型的區別

2021-07-13 17:25:11 字數 2885 閱讀 4370

一、封裝性 

封裝就是把抽取出來的資料和對資料的操作封裝在一起,資料被保護在內部,程式的其他部分只有被授權的操作(方法)才能對資料進行操作。 

php提供了三種訪問控制修飾符 

public 表示全域性,本類內部,類外部,子類都可以訪問 

protected 表示受保護的,只有本類或子類可以訪問 

private 表示私有的,只有本類內部可以訪問 

以上三種修飾符既可以修飾方法也可以修飾屬性(變數),方法如果沒有訪問修飾符則預設是public,成員屬性必須指定訪問修飾符,在php4中也有這種寫法 var $name,表示公開屬性,不推薦這種寫法 

例:複製** **如下:

<?php 

class person 

public function showinfo()  } 

$p1=new person('張三',20,3000); 

//這裡屬於類外部,那麼如果用下面的方法訪問age和salary都會報錯 

// echo $p1->age; echo$p1->salary; 

?>

那麼現在就想在外部訪問protected和private的元素和方法該怎麼辦? 通常做法是通過public函式去訪問這些變數 格式: 

public function set***x($val) 

public function get***x() 

這裡帶set和get只是為了識別方便,並非必要 

如: public function getsalary() 

在外部就可以通過 echo $p1->getsalary(); 

如果要訪問 protected和private也可以使用以下方法,但不推薦使用,只要了解即可 

__set() 和 __get() 

__set()對protected或private屬性進行賦值操作 

__set($name,$val); 

__get()獲取 protected 或 private的值 

__get($name); 

如:複製** **如下:

<?php 

class testa 

//使用__get()來獲取所有屬性值 

public function __get($pro_name) else   } 

} $n1=new testa(); 

//正常情況,類外部是不能訪問protected屬性的,但是用了上面的方法就可以對它們進行操作 

$n1->name='小三'; 

echo $n1->name; 

?>

//以上**看懂就行,不推薦使用 

二、繼承性

先看乙個例子:

複製** **如下:

<?php 

class pupil 

public function testing()  } 

class graduate 

public function testing()  } 

?>

從上面的例子可以看出,當多個類有很多共同屬性和方法時,**的復用性不高,**冗餘,思考css中的處理方法 

解決方法 :繼承

複製** **如下:

<?php 

class students 

public function showinfo()  } 

class pupil extends students  } 

class graduate extends students  } 

$stu1=new pupil('張三',20); 

$stu1->showinfo(); 

echo '

'; 

$stu1->testing(); 

?>

從上面可以看出,繼承就是乙個子類(subclass)通過 extends 父類 把父類(baseclass)中的public 和 protected 的屬性和方法繼續下來,不能繼承private屬性和方法 

語法結構: 

class 父類名{} 

class 子類名 extends 父類名{} 

細節: 

1、乙個子類只能繼承乙個父類(這裡指直接繼承);如果希望繼承多個類的屬性和方法,可以使用多層繼承 

例:複製** **如下:

<?php 

class a 

class b extends a 

class c extends b{} 

$p=new c(); 

echo $p->name;//這裡會輸出aaa 

?>

2、在建立某個子類物件時,預設情況下不會自動呼叫其父類的建構函式 

例: class a 

} class b extends a 

} $b=new b();//這裡會優先輸出b中的構造方法,如果b中沒有構造方法才會輸出a中的 

3、在子類中如果需要訪問父類的方法(構造方法、成員方法 方法的修飾符為protected或private),那麼可以使用 父類::方法名 或者 parent::方法名 來完成【這裡parent和以前提到的self都均為小寫,大寫報錯】 

class a 

} class b extends a 

} $b=new b(); 

5、如果乙個子類(派生類)的方法與父類的方法完全一樣時(public,protected),我們稱為方法覆蓋或方法重寫(override),看下面的多型性 

三、多型性

例 :複製** **如下:

<?php 

class animal  } 

class dog extends animal  } 

$dog1=new dog(); 

$dog1->cry(); 

?> 

封裝,繼承,多型

一 1 封裝 該隱藏隱藏,該公開的公開 屬性隱藏,同時提供get set方法 有些方法應該隱藏 方法宣告公開,實現隱藏。實現的改變對架構的影響最小 2 繼承 一般 特殊 單繼承 乙個類最多只能有乙個直接父類。類之間可以形成樹狀關係 根據訪問許可權,子類如果可以訪問父類的屬性和方法,就能繼承 priv...

繼承 封裝 多型

一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是乙個中心的元素並且和使用它的函式結合的很密切,從而保護它不被其它...

封裝 繼承 多型

一 封裝 封裝是實現物件導向程式設計的第一步,封裝就是將資料或函式等集合在乙個個的單元中 我們稱之為類 被封裝的物件通常被稱為抽象資料型別。封裝的意義 封裝的意義在於保護或者防止 資料 被我們無意中破壞。在物件導向程式設計中資料被看作是乙個中心的元素並且和使用它的函式結合的很密切,從而保護它不被其它...