面向對象、繼承、抽象方法重載知識點整理
面向過程、面向對象
面向過程:從開始到結束自己獨立完成
面向對象:將一個事物劃分為單體來各自實現區域性的功能,最後通過調用組合完成
類、對象
類:某一些具有共同特征的物體
對象:指某一種具體的物體,屬於某一個類
類成員(成員屬性,成員方法)
類裏面只包括屬性和方法
使用屬性的格式為:$對象->屬性名(屬性名前不加$符號)
方法直接在類裏面定義
靜態屬性、靜態方法
在定義屬性的時候,前面加上static就是靜態屬性,只屬於類本身
靜態屬性的使用:類 :: $靜態屬性名(::雙冒號)
靜態方法也是只屬於類,不屬於具體對象
靜態方法中不能掉用非靜態方法
靜態方法的使用:類名 :: $靜態方法名(::雙冒號)
如果通過類名來調用靜態方法,不能出現$this關鍵字
構造__construct()、析構方法__destruct()
插入一個對象的同時,也給這個對象賦值,然後本身就會有屬性值,可以在本類內調用
例:
class Teacher{
public $name="匿名";
public $age="未知";
public $eduction="未知";
function _ _construct($name,$age,$eduction){
$this->name=$name;
$this->age=$age;
$this->eduction=$eduction;
}
function showAllInfo(){
echo"<br/>hi,大家好,我叫".$this->name;
echo"<br/>今年".$this->age."歲";
echo "<br/>學歷:".$this->eduction;
}
}
$teacher1=new Teacher("張三",22,"本科");
$teacher2=new Teacher("李四
$teacher1->showAllInfo();
echo "<br>";
$teacher2->showAllInfo();
1,該方法名字是固定的,為:_ _construct();註意:兩個下劃線
2,該方法必須是普通方法(不能是靜態方法)
3,通常該方法應該是public
4,通常該方法中使用$this這個關鍵字來對屬性進行賦值
5,當new 類名()的時候,其實是在調用該構造方法
6,在一個類中有構造方法,那麽在本類的方法中就會調用構造方法中的值
構造 方法是“創建”對象的時候會自動調用。
析構 方法是“銷毀”對象的時候會自動調用。
說明:
1,析構方法通常不太需要去定義。
2,析構方法不能調用。
3,析構方法不能有形參。
4,析構方法中可以用於清理一些在php代碼結束後不能清理的數據,如生成的文件。
對象銷毀的幾個情形:
腳本程序運行結束,自動銷毀;
明確地unset()一個對象變量,則被銷毀;
改變對象變量的值,被銷毀;
$this、self、parent
$this:$this是一個“偽對象”,代表當前所屬類的當前對象。
Self:含義:代表當前類
只能在某個類的方法裏代表該類的名稱
Class S{
Public $v=1;
Static funcation new(){
Return new self;//self代表當前類
//new self 代表當前類的一個對象
}
}
$obj = S::new(); //通過s的靜態方法得到當前類的一個新對象
Var_dump($obj);
Parent:代表父類
一般用於子類調用父類內容時使用,通常使用父類的靜態類
class C{
public $p1 = 1;
function showMe(){
echo "<br />我是父類,數據有:";
echo "<br />C中p1=" . $this->p1;
}
function _ _construct($p1){
$this->p1 = $p1;
}
}
class D extends C{
public $p2 = 2;
function __construct($p1,$p2){
//經典用法
parent::__construct($p1);//調用父類的構造函數來初始化p1
$this->p2 = $p2; //初始化p2
}
function showMe2(){
echo "<br />我是子類,數據有:";
//基本用法:
parent::showMe();//調用父類的showMe方法, 使用靜態方法調用
echo "<br />D中p2=" . $this->p2;
}
}
$d1 = new D(10,20); //此時就需要尊照構造函數的參數結構來使用
$d1->showMe2();
public、protected、private、static
public:公共的(只要在文檔中都可以用)一般用於設置變量
protected:受保護的(可以在當前類或當前類的上下級具有繼承關系的類中訪問)
private:私有的(只能在當前類中使用)
extends :繼承 (子類繼續父類)
Static:靜態
重寫、重載__set()__get()__isset()__unset()
所謂屬性重載,就是在面對上述4種情形的屬性使用場景中,該對象如果來“應對”的問題。
如果某屬性不存在,但在語法中使用如下情形,則會發生:
都稱之為:魔術方法“”
取值:$v1 = 對象->屬性; ===>自動調用類中的__get()方法
賦值:對象->屬性 = XX值; ===>自動調用類中的__set()方法
判斷是否存在:isset(對象->屬性;) ===>自動調用類中的__isset()方法
銷毀:unset(對象->屬性;) ===>自動調用類中的__unset()方法
重寫關鍵字:override
例子:
class C{
function show1($para1){
echo "<br />父類的show1方法:para1 = " . $para1;
}
}
class D extends C{
function show1($para, $para2){//參數不一致
echo "<br />子類的show1方法";
}
}
在繼承關系中使用,可以節約代碼
重載方法
在一個類中,有多個同名的方法,每個方法的參數不同而已。這種現象就稱為“重載”
參數不同可以是:數量個數不同,或類型不同,或順序不同
例子
class A{
int function f1(int x){......}
int function f1(int x, int y){.....}
int function f1(string s int m){....}
}
在PHP中重載只是一個概念
__call() __callStatic() __clone()
方法重載關鍵字:__call
例子:
Function f1(){
Echo :”f1被調用”
}
Function f2($x,$y){
echo :”f2被調用”;
return $x+$y;
}
Class a{
Public $p1=1;
Function __call($x,$arr){
$c=count($array);
If($c==0){
F1();
}else if(){
Return f2($arr[0],$arr[1]);
}
}
}
$d=new a();
$d->f1();
$v1=$d->f1(1,2)//f1不存在兩個參數
echo "<br />d1裏面的p1=" . $d1->p1;
echo "<br />結果v1=" . $v1;
執行結果
f1被調用
f1被調用
o1裏面的p1=1
結果v1=3
一個對象還可以使用clone運算符進行克隆,則就也會“生成”新對象。
當使用一個對象(類)調用一個不存在的靜態方法的時候,會自動去調用預先定義好的"__callStatic"方法。(該方法必須帶2個參數)
extends、abstract
Extends:子類繼承父類
Abstract:抽象類
在正常定義類的前面,加上關鍵字:abstract,那就構成抽象類。
abstract class 類名{.....類的定義.....}
接口interface
單例:
1、私有屬性(值是對象)
2、私有構造方法(不能new)
3、提供獲取對象的方法(這裏面判斷是否存在)
4、私有克隆
面向對象三大特性:封裝、繼承、多態
工廠模式
class factory{
//Instance表示“實例”,“對象”
static function getInstance($className){
if(file_exists(‘./class/‘ . $className . ".class.php")){
$obj1 = new $className();
return $obj1;
}else{
return null;//也可以die();
}
}
}
$obj1 = factory::getInstance("A");//獲取類A的一個對象
$obj2 = factory::getInstance("B");//獲取類B的一個對象
$obj3 = factory::getInstance("A");//再獲取類A的一個對象
優點:只需要指定對象就可以創建
最終類final class:
通常,一個類,沒有特別聲明的話,則“別人”就可以隨意拿過來使用並對之進行“擴展”——繼承。
但是:
如果某個類不希望對其進行擴展,則可以將其聲明為“最終類”。
形式:
final class 類名{ 。。。。類定義。。。。}
最終方法final method
通常,一個方法,如果沒有特別聲明,則下級類就可以對其進行“覆蓋”(重寫)。
但是:
如果某個方法不希望被下級類覆蓋,就可以對其生命為“最終方法”。
形式:
final function 方法名(){。。。。方法定義。。。。}
面向對象、繼承、抽象方法重載知識點整理