1. 程式人生 > >面向對象、繼承、抽象方法重載知識點整理

面向對象、繼承、抽象方法重載知識點整理

特征 protected 現象 lin 設置變量 運行 初始 靜態方法 封裝

面向過程、面向對象

  面向過程:從開始到結束自己獨立完成

  面向對象:將一個事物劃分為單體來各自實現區域性的功能,最後通過調用組合完成

類、對象

  類:某一些具有共同特征的物體

  對象:指某一種具體的物體,屬於某一個類


類成員(成員屬性,成員方法)

  類裏面只包括屬性和方法

  使用屬性的格式為:$對象->屬性名(屬性名前不加$符號)

  方法直接在類裏面定義


靜態屬性、靜態方法

  在定義屬性的時候,前面加上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("李四

",23,"研究生");

$teacher1->showAllInfo();

echo "<br>";

$teacher2->showAllInfo();
  1,該方法名字是固定的,為:_ _construct();註意:兩個下劃線
  2該方法必須是普通方法(不能是靜態方法)
  3,通常該方法應該是public
  4,通常該方法中使用$this這個關鍵字來對屬性進行賦值
  5,當new 類名()的時候,其實是在調用該構造方法
  6在一個類中有構造方法,那麽在本類的方法中就會調用構造方法中的值

構造 方法是“創建”對象的時候會自動調用。

析構 方法是“銷毀”對象的時候會自動調用。

說明:

  1,析構方法通常不太需要去定義。

  2,析構方法不能調用。

  3,析構方法不能有形參。

  4,析構方法中可以用於清理一些在php代碼結束後不能清理的數據,如生成的文件。

 對象銷毀的幾個情形:

腳本程序運行結束,自動銷毀;

明確地unset()一個對象變量,則被銷毀;

改變對象變量的值,被銷毀;

$thisselfparent

$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 />Cp1=" . $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 />Dp2=" . $this->p2;

  }

}

$d1 = new D(10,20); //此時就需要尊照構造函數的參數結構來使用

$d1->showMe2();


publicprotectedprivatestatic

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個參數


extendsabstract

  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 方法名(){。。。。方法定義。。。。}

面向對象、繼承、抽象方法重載知識點整理