PHP面向對象
php是單繼承語言不能同時繼承兩個類
- 定義類用class 對象是類的實例化 項目由對象構成
- Public 公共類型 所有程序皆可使用
Private 私有類型 只有該類內可以使用
Protected 受保護類型 只有該類或者其子類或者父類可以使用
3.構造方法和析構方法
構造方法發 __contruct 實例類方法的時候自動執行
析構方法 __destruct 註銷對象的時候自動執行
也可以手動關閉 unset($var) 手動註銷對象
類常量關鍵字const 定義類裏的常量,定義後就不再改變
調用類常量通常用self::常量名來調用 可以不用實例化直接使用
類名::類常量名
- 子類方法覆蓋父類方法
當子類方法與服了方法重名,子類方法會覆蓋父類方法,調用子類方法時不再顯示父類同名方法內容
Parent關鍵字可以調用父類內的方法或屬性 例如parent::父類內的方法或屬性名
Final關鍵詞寫在class前 作用是令該類無法被繼承
- 命名空間namespace
作用防止不同文件中的方法應用到一個頁面時起衝突
使用的時候在對應類頁面開頭加上namespace 路徑名(隨意)給兩個有同樣方法的頁面標上不同的命名空間,可避免衝突。引用的時候只需在調用處加上命名空間就可以引用,如果覺得命名空間太長,則可以用use關鍵字引入不同頁面下的方法用as起個別名然後可以直接用別名來引用
全局空間包含命名空間 若命名空間內文件要調用全局空間內的東西,則在調用處加上字符 \ 就可以引用。注意命名空間中調用全局空間中的類必須加 \ ,而調用函數或常量的時候可以不加 \ ,因爲php命名空間中沒有這個類必須要用 \ 纔可以到全局空間找需要使用的類,而命名空間中若沒有要調用的函數或者變量則php會自動去全局空間尋找
- 類的自動加載機制
- php中一般一個類用一個文件來儲存這樣引用類時要用多個require/include引用多個類 這樣很麻煩,所以用類的自動加載機制來簡化這一個過程
- 每個類按照類所在文件名定義命名空間,文件名+類名=類所在路徑
- 方法 spl_autoload_register(function($className){ include ---- })
- static方法
如果在類裏定義static屬性 就相當於const了一個類屬性或者類方法 可以通過類名直接調用
代表類的對象的是this
代表類的本身的是self
後期綁定static方法 static綁定的都是後期子類,self綁定的是本身
- 魔術方法
__set($var,$val) 調用的時候只需要實例化對象 ,直接給私有變量賦值就可以比如
$實例化對象名->私有屬性名=’新變量’
__get($var) 返回私有屬性 調用舉例$實例化對象名->私有屬性名
__Isset($var) 判斷私有屬性是否已經存在 不存在返回ture
__unset($var) 刪除一個私有屬性的方法
__call($functionName,$val) 當調用的是實例化方法不存在時就會調用__call方法,避免程序拋錯
__callStatic($staticFunctionName,$val) 當調用的靜態方法不存在時會自動調用callStatic方法,避免程序拋錯
__invoke($val) 把類方法當作函數調用的時候自動執行這個函數
__toString() 打印要輸出的類對象時自動調用這個函數
__clone() 當調用clone關鍵字函數時會自動執行__clone()函數
- 對象複製
淺拷貝 php中對象的拷貝時淺拷貝,拷貝的物理地址,對物理地址的傳遞,這樣修改其中一個其餘的也跟着改變
若想深拷貝類對象,需要在傳值時加上c lone 比如$b=clone$a;這樣修改一個值其餘的不變
深拷貝 php中處了對象之外的普通類型拷貝是深拷貝
- 類型約束
class test1{
public function test1(){
echo 'hello world!';
}
}
function test1(test1 $a){
$a->test1();
}
$test1=new models\test1();
models\test1($test1);
- 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;
}
- 接口
通俗講接口是類的模板,類是對象的模板
接口中只寫方法名,具體的實現方法由類來完成
我們學的是面向對象思維,但是叫面向接口思維更貼切
接口可以被繼承但不能直接被實例化,接口可以多繼承
類以此可以實現多個接口
關鍵詞 interface
實現接口關鍵詞implements
- 抽象類
抽象類類似接口但是抽象類中可以存在已經實現的方法,接口中只能由非實現的方法名
關鍵詞abstract
類直接繼承抽象類就可以,但是要實現抽象類中未實現的方法
- 單例工廠
防止被過多實例化佔用空間,確保一個類只能實例化一次
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);
- 工廠模式
工廠模式應用於緩存類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();
}
}