三大特征
- 封裝
- 繼承
- 多態(tài)
封裝性
封裝就是把抽象出的數(shù)據(jù)和對(duì)數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部,程序的其他部門只有通過(guò)被授權(quán)的操作(成員方法),才能對(duì)數(shù)據(jù)進(jìn)行操作。
-
訪問(wèn)修飾符
- 訪問(wèn)修飾符既可以修飾方法,也可以修飾屬性
- public:表示全局,類內(nèi)部、外部和子類都可以訪問(wèn);
- protected:表示受保護(hù)的,只有本類或子類可以訪問(wèn);
- private:表示私有的,只有本類內(nèi)部可以使用。
//關(guān)于封裝 class Person{ public $name; protected $age; private $salary; function __construct($name,$age,$salary){ $this->name=$name; $this->age=$age; $this->salary=$salary; } function showInfo(){ echo $this->name."||".$this->age."||".$this->salary; } //通過(guò)一個(gè)方法訪問(wèn)protected或者private變量 public function getSalary($name,$pass){ if($name=="lyangye" && $pass==12345){ return $this->salary; }else { echo "滾蛋,嘻嘻嘻"; } } //修改年齡 public function setAge($age){ if($age>1 && $age<120){ $this->age=$age; }else { echo "你的年齡范圍不對(duì)"; } } //查看年齡 public function getAge(){ return $this->age; } } $p1=new Person("孫悟空",30,10000); echo $p1->name."<br />"; echo $p1->getSalary("lyangye",12345); $p1->setAge(-23); echo "<br />".$p1->getAge(); -
訪問(wèn)控制修飾符
- 如果想要訪問(wèn)private和protected變量,通常的做法是提供public函數(shù)去訪問(wèn)這些變量;
- 方法直接可以互相調(diào)用,但是需要使用$this引用
function test1(){
$this->test2();
}
private function test2(){
echo "test2";
}
繼承性
所謂繼承就是一個(gè)子類 通過(guò)extends 父類,把父類的一些()public\protected)屬性和(public\protected)方法繼承下來(lái);
-
繼承的基本語(yǔ)法是:
- class 類名 extends 父類名(
//寫自己需要的屬性和方法
)
- class 類名 extends 父類名(
-
一些細(xì)節(jié):
繼承可以解決代碼復(fù)用,讓我們的編程更加靠近人類思維。
父類的public\protected的屬性和方法被繼承,private的屬性和方法沒(méi)有被繼承;
-
直接繼承的情況下,子類最多只能繼承一個(gè)父類;
- 但是可以通過(guò)錯(cuò)層繼承的方法來(lái)繼承多個(gè)類;
class A{
protected $n1=90;
}
class B extends A{
function show(){
echo $this->n1;
}
public $n2="hello";}
class C extends B{}
$c=new C();
echo $c->show();
echo $c->n2;
```- 顯示效果:-
在創(chuàng)建某個(gè)子類對(duì)象時(shí),默認(rèn)情況下不會(huì)自動(dòng)調(diào)用其父類的構(gòu)造函數(shù);
class A{ public $n1=90; public function __construct(){ echo "A __construct"; } } class B extends A{ function __construct(){ echo "B __construct"; } } $b=new B(); -
顯示效果:默認(rèn)情況下,沒(méi)法繼承父類構(gòu)造函數(shù)
-
如果想要調(diào)用父類的構(gòu)造方法或者其他方法(puiblic\protected)的方法
- 方法1:類名::方法名();
- 方法2:parent::方法名();
class A{ public $n1=90; public function __construct(){ echo "A __construct<br/>"; } } class B extends A{ function __construct(){ echo "B __construct<br/>"; //顯式的調(diào)用 A::__construct(); parent::__construct(); } } $b=new B();- 顯示效果:當(dāng)一個(gè)子類的方法和父類的方法完全一樣,成為方法的重寫;
子類可以繼承其父類的public,protected修飾的變量(屬性)和函數(shù)(方法);
方法重載
- 基本概念:函數(shù)名一樣,通過(guò)函數(shù)的參數(shù)個(gè)數(shù)或者參數(shù)類型不同,達(dá)到調(diào)用同一個(gè)函數(shù)名,但是可以區(qū)分不同的函數(shù)。
- "重載"是類的多態(tài)的一種實(shí)現(xiàn);
- 函數(shù)重載指一個(gè)標(biāo)識(shí)符被用作多個(gè)函數(shù)名,且能夠通過(guò)函數(shù)的參數(shù)個(gè)數(shù)或參數(shù)類型將這些同名的函數(shù)區(qū)分開(kāi)來(lái),調(diào)用不發(fā)生混淆。
- PHP5默認(rèn)情況下,不直接支持方法重載;
- PHP5中可以通過(guò)__call魔術(shù)方法,模擬一個(gè)方法重載的效果;
class A {
public function test1($n){
echo "接受一個(gè)參數(shù)<br/>";
echo "接收到參數(shù)的是:";
var_dump($n);
}
public function test2($n){
echo "<br/>接受兩個(gè)參數(shù)<br/>";
echo "接收到參數(shù)的是:";
var_dump($n);
}
//__call是當(dāng)一個(gè)對(duì)象調(diào)用某個(gè)方法,而該方法不存在,則系統(tǒng)回自動(dòng)調(diào)用__call
function __call($method,$n){
if($method=="test"){
if(count($n)==1){
$this->test1($n);
}else if(count($n)==2){
$this->test2($n);
}
}
}
}
$a=new A();
$a->test(1);
$a->test(22,33);
方法的重寫/方法的覆蓋(override)
- 當(dāng)一個(gè)父類知道所有的子類都有一個(gè)方法,但是父類不能確定該方法如何寫,則可以讓子類進(jìn)行方法的覆蓋;
//抽象一個(gè)Animal類
class Animal{
public $name="lhpoicq";
protected $price;
function aoaoao(){
echo "不知道怎么叫";
}
}
class dog extends Animal {
function aoaoa(){
echo "汪汪汪";
}
}
class pig extends Animal {
function aoaoao(){
echo "XXX";
}
}
$dog1=new dog();
echo $dog1->name;
$pig1=new pig();
$pig1->aoaoao();
-
輸出效果:
- 細(xì)節(jié)
- 要實(shí)現(xiàn)重寫,需要子類的方法和參數(shù)列表一摸一樣;
- 如果子類要去調(diào)用父類的方法(public\protected)則可以使用parent::方法名(參數(shù)),父類名::方法名(參數(shù));
- 子類的方法的參數(shù)個(gè)數(shù),方法名稱,都要和父類方法的參數(shù)個(gè)數(shù),方法名稱一樣;
- 子類方法不能縮小父類方法的訪問(wèn)權(quán)限。
//子類方法不能縮小父類方法的訪問(wèn)權(quán)限 class Animal { public function cry(){ echo "動(dòng)物交換.."; } } class Cat extends Animal { protected function cry(){ echo "小貓喵喵喵"; Animal::cry(); } } $cat1=new Cat();- 顯示效果:
多態(tài)的體現(xiàn)
class Animal{
protected function cry($name){
echo "動(dòng)物叫喚...".$name;
}
}
class Cat extends Animal{
public function cry($val){
echo "貓貓叫喚...".$val;
//Animal::cry($val);
}
}
$cat1=new Cat();
$cat1->cry("hello");
- 當(dāng)子類沒(méi)有覆蓋父類的方法,則$cat1->cry()調(diào)用的是父類的方法,當(dāng)子類覆蓋了父類的方法,則調(diào)用自己的cry()


