PHP面向對象筆記

 PHP面向對象

php是單繼承語言不能同時繼承兩個類

  1. 定義類用class  對象是類的實例化  項目由對象構成
  2. Public 公共類型  所有程序皆可使用

Private 私有類型 只有該類內可以使用

Protected 受保護類型  只有該類或者其子類或者父類可以使用

3.構造方法和析構方法

構造方法發  __contruct  實例類方法的時候自動執行

析構方法         __destruct       註銷對象的時候自動執行

也可以手動關閉 unset($var)  手動註銷對象

類常量關鍵字const 定義類裏的常量,定義後就不再改變

調用類常量通常用self::常量名來調用 可以不用實例化直接使用

類名::類常量名

  1. 子類方法覆蓋父類方法

當子類方法與服了方法重名,子類方法會覆蓋父類方法,調用子類方法時不再顯示父類同名方法內容

Parent關鍵字可以調用父類內的方法或屬性 例如parent::父類內的方法或屬性名

Final關鍵詞寫在class 作用是令該類無法被繼承

  1. 命名空間namespace 

作用防止不同文件中的方法應用到一個頁面時起衝突

使用的時候在對應類頁面開頭加上namespace 路徑名(隨意)給兩個有同樣方法的頁面標上不同的命名空間,可避免衝突。引用的時候只需在調用處加上命名空間就可以引用,如果覺得命名空間太長,則可以用use關鍵字引入不同頁面下的方法用as起個別名然後可以直接用別名來引用

 

全局空間包含命名空間  若命名空間內文件要調用全局空間內的東西,則在調用處加上字符 \ 就可以引用。注意命名空間中調用全局空間中的類必須加 \ ,而調用函數或常量的時候可以不加  \ ,因爲php命名空間中沒有這個類必須要用 \ 纔可以到全局空間找需要使用的類,而命名空間中若沒有要調用的函數或者變量則php會自動去全局空間尋找

 

  1. 類的自動加載機制
  1. php中一般一個類用一個文件來儲存這樣引用類時要用多個require/include引用多個類  這樣很麻煩,所以用類的自動加載機制來簡化這一個過程
  2. 每個類按照類所在文件名定義命名空間,文件名+類名=類所在路徑
  1. 方法 spl_autoload_register(function($className){  include ---- })

 

  1. static方法

如果在類裏定義static屬性  就相當於const了一個類屬性或者類方法  可以通過類名直接調用

代表類的對象的是this

代表類的本身的是self

後期綁定static方法  static綁定的都是後期子類,self綁定的是本身

 

  1. 魔術方法

__set($var,$val  調用的時候只需要實例化對象 ,直接給私有變量賦值就可以比如

$實例化對象名->私有屬性名=’新變量’

__get($var)             返回私有屬性  調用舉例$實例化對象名->私有屬性名

 

__Isset($var)           判斷私有屬性是否已經存在 不存在返回ture

 

__unset($var)         刪除一個私有屬性的方法

 

__call($functionName,$val) 當調用的是實例化方法不存在時就會調用__call方法,避免程序拋錯

 

__callStatic($staticFunctionName,$val)  當調用的靜態方法不存在時會自動調用callStatic方法,避免程序拋錯

 

__invoke($val)  把類方法當作函數調用的時候自動執行這個函數

 

__toString()     打印要輸出的類對象時自動調用這個函數

 

__clone()         當調用clone關鍵字函數時會自動執行__clone()函數

  1. 對象複製

淺拷貝  php中對象的拷貝時淺拷貝,拷貝的物理地址,對物理地址的傳遞,這樣修改其中一個其餘的也跟着改變

若想深拷貝類對象,需要在傳值時加上c lone 比如$b=clone$a;這樣修改一個值其餘的不變

深拷貝    php中處了對象之外的普通類型拷貝是深拷貝

 

  1. 類型約束

 class test1{

   

    public function test1(){

        echo 'hello world!';

    }

}

 

function test1(test1 $a){

    $a->test1();

}

$test1=new models\test1();

models\test1($test1);

 

  1. Trait

由於php是單繼承語言爲了解決這一問題,引入trait關鍵字,trait相當於方法模板,類要應用的時候直接用use關鍵詞比如use A/use A,B;

trait A{

    public function A(){

        echo'hello ';

    }

}

trait B{

    public function B(){

        echo 'world ';

    }

}

trait C{

    use A,B;

}

 

class test3{

//     use A,B;

    use C;

   

}

 

 

  1. 接口

通俗講接口是類的模板,類是對象的模板

接口中只寫方法名,具體的實現方法由類來完成

我們學的是面向對象思維,但是叫面向接口思維更貼切

接口可以被繼承但不能直接被實例化,接口可以多繼承

類以此可以實現多個接口

關鍵詞 interface

實現接口關鍵詞implements

 

  1. 抽象類

抽象類類似接口但是抽象類中可以存在已經實現的方法,接口中只能由非實現的方法名

關鍵詞abstract

類直接繼承抽象類就可以,但是要實現抽象類中未實現的方法

 

  1. 單例工廠

防止被過多實例化佔用空間,確保一個類只能實例化一次

class test5{

    private static $_instance=NULL;

    private function __construct(){

       

    }

    private function __clone(){

       

    }

    public static function getInstance(){

        if(!(self::$_instance instanceof self)){

            self::$_instance=new self();

        }else {

            return self::$_instance;

        }

    }

}

$test1=test5::getInstance();

$test2=test5::getInstance();

var_dump($test1);

var_dump($test2);

 

  1. 工廠模式

工廠模式應用於緩存類Memcache/Redis等緩存類的底層改變

class Memcache{

    public $a=0;

    public function set($a){

        $this->a=$a;

    }

    public function get(){

        return $this->a;

    }

    public function delete(){

        unset($this->a);

    }

}

class test6{

    public static function factory(){

        return new Memcache();

    }

}

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章