一忽孽、php面向?qū)ο蟮娜筇卣鳎?br>
1绑改、封裝:
封裝就是把抽象出的數(shù)據(jù)和對數(shù)據(jù)的操作封裝在一起,數(shù)據(jù)被保護(hù)在內(nèi)部兄一,程序的其他部分只有通過被授權(quán)的操作(成員方法)才能對數(shù)據(jù)進(jìn)行操作厘线。

2、繼承:
所謂繼承出革,就是一個子類通過extends 父類 把父類的一些(public / protected)屬性和(public / protected)方法繼承下來造壮。不能繼承私有的。
作用:增加代碼復(fù)用性骂束,管理代碼成本低费薄。
基本語法:
class 類名 extends 父類名 {
//需要的非私有屬性和方法
}
<?php
//父類
Class Student {
public $name;
protected $age;
protected $grade;
// public __construct() {
// }
public function showInfo() {
echo $this -> name."<br/>".$this -> age;
}
}
/**
* 小學(xué)生
*/
class Pupil extends Student
{
public function test() {
echo "<br/>小學(xué)生在考試。栖雾。楞抡。";
}
}
/**
* 大學(xué)生
*/
class Graduate extends Student
{
public function test() {
echo "<br/>大學(xué)生在考試。析藕。召廷。";
}
}
$stu1 = new Pupil();
$stu1 -> name = "lizzy";
$stu1 -> test();
$stu1 -> showInfo();
$stu2 = new Graduate();
$stu2 -> name = "zxm";
$stu2 -> test();
$stu2 -> showInfo();
?>
注意:
(1)protected屬性和方法受保護(hù),在子類不能直接調(diào)用,要在子類中定義方法訪問竞慢。
Class ParentClass {
public $name = 'lizzy';
protected $age = 24;
private $sex = "女";
public function test1() {
echo "<br/>展示public方法";
}
protected function test2() {
echo "<br/>展示protected方法";
}
private function test3() {
echo "<br/>展示private方法";
}
}
Class SubClass extends ParentClass {
function show() {
echo "age=".$this->age;
// echo "sex=".$this->sex;//是不能繼承下來的
$this -> test2();
}
}
$sub1 = new SubClass();
$sub1 -> show();
$sub1 -> test1();
(2)如果希望子類調(diào)用父類的構(gòu)造方法先紫,或者其他方法(public / protected),可以使用類名::方法名; 或者parent::方法名;
Class A {
public $n1=90;
public function __construct() {
echo "A的構(gòu)造方法";
}
}
Class B extends A {
function __construct() {
echo "B的構(gòu)造方法";
//調(diào)用父類的兩種方法
// A::__construct();
parent::__construct();
}
}
$b = new B();
(3)當(dāng)一個子類的方法和父類方法(protected/public)完全一致時筹煮,我們稱之為方法的覆蓋(重寫)遮精。
3、多態(tài):
“重載”是類的多態(tài)的一種表現(xiàn)败潦;
重載的概念:函數(shù)名一樣本冲,通過函數(shù)的參數(shù)個數(shù)或者參數(shù)類型不同,達(dá)到調(diào)用同一個函數(shù)名劫扒,但是可以區(qū)分不同的函數(shù)檬洞。
魔法函數(shù)__call,但不推薦使用沟饥; 它一個對象調(diào)用某個方法添怔,而該方法不存在,則系統(tǒng)會自動調(diào)用__call贤旷。
<?php
Class A {
public function test1($p) {
echo "接收一個參數(shù)<br/>";
}
public function test2($p) {
echo "接收兩個參數(shù)<br/>";
}
//提供__call 它一個對象調(diào)用某個方法广料,而該方法不存在,則系統(tǒng)會自動調(diào)用__call
function __call($method,$p) {
if ($method == "test") {
if (count($p) == 1) {
$this -> test1($p);
} elseif (count($p) == 2) {
$this -> test2($p);
}
}
}
}
$a = new A();
$a -> test(1);
$a -> test(21,43)
?>
常見魔法常量:兩個下劃線LINE兩個下劃線;當(dāng)前多少行幼驶;
兩個下劃線FILE兩個下劃線;當(dāng)前文件的絕對路徑艾杏;
方法的重寫/覆蓋(override):
1、當(dāng)一個父類知道所有的子類都有一個方法县遣,但是父類不能確定該方法究竟如何寫糜颠,可以讓子類去覆蓋這個方法。
使用如下:
<?php
Class Animal {
function cry() {
echo "不知道怎么叫";
}
}
//重寫
Class Dog extends Animal {
function cry() {
echo "小狗汪汪叫";
}
}
//重寫
Class Pig extends Animal {
function cry() {
echo "小豬哼哼叫";
}
}
$dog = new Dog();
$dog -> cry();
$pig = new Pig();
$pig -> cry();
?>
方法重寫的細(xì)節(jié):
1萧求、重寫子類的函數(shù)名和參數(shù)個數(shù)必須和父類的一致其兴;但不要求參數(shù)的名稱一樣。
2夸政、如果子類要去調(diào)用父類的某個方法(public / protected)可以使用parent::方法名(); 或者父類名::方法名(); 可根據(jù)情況是否傳參元旬。
3、實(shí)現(xiàn)方法覆蓋時守问,訪問修飾符可以不一樣匀归,但是必須滿足子類的訪問范圍>=父類的訪問范圍。
多態(tài)體現(xiàn)的地方:
當(dāng)子類沒有覆蓋父類的方法耗帕,則子類調(diào)用的是父類穆端,當(dāng)子類覆蓋了父類的方法則調(diào)用的是自己的方法。