PHP面向物件(一)
self-----------代表類本身,只能在當前類內部的函式中使用,代表程式碼所在的類;
$this----------代表當前類的當前物件(在物件呼叫的方法中使用$this 就代表哪個類的物件),在子類物件呼叫繼承自父類的方法時,方法中的$this 是子類的物件;;如果是在static靜態方法中,不能使用;
static-------作用1:靜態變數; 作用2:靜態方法;靜態方法中不能呼叫非靜態方法;作用3:呼叫的是static所在的這個個方法,哪個類呼叫這個方法,static就代表這個類,作用4:靜態繫結;
parent------代表父類,
類中只有個三種成員:屬性,方法,常量;
除了這三種成員外,其他的如流成控制語句if ,while,for,case等都只能在函式中使用;
類中的屬性 前面要加上var ;類之外的變數不需要加var ;
訪問修飾符:public,protected,private;----不寫預設是public;
呼叫:物件->屬性;(不加$)
物件->方法;
注意方法4 不加括號;
物件的變數進行普通傳值得時候,複製的是物件變數中所儲存的物件識別符號;物件識別符號指向真正的資料;
-------------------------------------------------------------------------
物件的屬性可以定義不賦值,不能是表示式和變數,可以是直接值和常量;前面必須加上public或var;
變數必須定義的同時賦值;
定義屬性時 $前面必須要加上var 或public,
在函式中計算的時候用 $變數名 就可以了;
定義屬性的時候要加var $或者 public $;在呼叫屬性的時候不要加var $或者 public $;
pow(9,0.5);----------------9的0.5次方
$this 是一個偽物件,代表當前類的當前物件;
-----------------------------
------------------靜態屬性-----------------------------------------
靜態屬性隸屬於類本身,同一個類的所有物件共享資料;
靜態屬性的呼叫-------------用類名去呼叫********類名::
靜態屬性的呼叫-------------用物件去呼叫********物件名::$靜態屬性名;
----------------------通過物件也可以使用靜態屬性--------------------
獲取物件所屬的類名:get _class();
只是得到一個類的名稱,並不能得到這個類;
----------------靜態方法-----------------------
靜態方法屬於類,所有物件共有;
靜態方法的呼叫-------類名::靜態方法名();
物件亦可以呼叫靜態方法------物件名::靜態方法名();
靜態方法中不能使用$this;靜態方法中不能呼叫非靜態方法;
類呼叫一般的非靜態方法或靜態變數,只能在自己的類中呼叫,其他地方呼叫會報錯;類呼叫靜態方法可以在任何地方;
$this----------代表當前類的當前物件;如果是在static靜態方法中,通過類名呼叫靜態方法不能使用$this;靜態方法是用類呼叫,此時沒有物件;
靜態方法中不能呼叫非靜態方法,靜態方法中可以用self(代表當前類),通過類名呼叫的靜態方法不能用$this;一般方法中可以用this(代表當前物件)
==============構造方法=============
new的時候,會自動呼叫__construct($n,$a);如果定義構造方法,則呼叫時的實參必須和構造方法的引數個數一致;
如果不實現__condtruc()構造方法,系統會預設執行父類的構造方法;如果父類沒有,就一直往上找,最終找到系統的不帶引數的構造方法,那麼就對結果沒有影響;
$p=new p("lisi",18);//用構造方法建立一個物件;
==============析構方法=============
析構方法不能手動呼叫,在銷燬物件unset()時會自動呼叫,析構方法可以用於清理一些在PHP程式碼結束後不能清理的資料,如生成的檔案;
程式結束的時候,所有物件被銷燬,會呼叫析構方法;銷燬物件unset()時也會呼叫析構方法;改變物件變數的值,原來變數指向的物件沒有被變數指向,就會銷燬物件,也會呼叫析構方法;
function __destruct(){
}
PHP程式結束後,PHP所有的物件自動銷燬,析構方法是PHP內部的垃圾回收機制;
總結:
子類中沒有定義構造方法會自動呼叫父類的構造方法,例項化子類的時候會按照父類的構造方法進行;
子類中定義了自己的構造方法,則不會自動呼叫父類的構造方法,但是可以手動呼叫parent ::__construct();
析構方法和構造方法用法相同。
------------------類的繼承-----------------------
類的繼承: Class A類 extends B類{
}
訪問修飾符---------------------------------------------
上面的例子是子類訪問父類的屬性$p1;
下面這個例子是父類訪問子類的屬性$p2,但是不常用;要注意:
protected收保護的,只能在當前類或者有繼承關係的上下級使用;
private修飾符只能在本類中使用:
parent,self,this--------------------------------
parent : : 父類的方法;
self :: 自己的方法或者繼承父類的方法;
$this ->自己的方法或者繼承父類的方法;
系統有預設的構造方法:function __construct(){ },如果自己在類中實現 了構造方法,就會覆蓋系統的構造方法;
子類中沒有定義構造方法會自動呼叫父類的構造方法,例項化子類的時候會按照父類的構造方法進行;
子類中定義了自己的構造方法,則不會自動呼叫父類的構造方法,但是可以手動呼叫parent ::__construct();
析構方法和構造方法用法相同。
//=================連結資料庫==============
-------------------重寫override-------------------------
重寫針對的是非構造方法和非析構方法;
將從父類繼承下來的屬性和方法重寫或者覆蓋;覆蓋是建立在繼承的基礎上,如果沒有繼承,談不上覆蓋重寫了;
訪問控制的許可權不應該低於上一級的許可權;
重寫的普通方法的引數個數必須和父類的引數個數一致,引數的名字可以寫成不一樣的;
構造方法可以重寫,引數也可以不一致;
私有的屬性和私有的方法,不能覆蓋,但子類可以定義和父類同名的方法和屬性,但是隻作為當前類的自有屬性;
-------------最終類和最終方法----------------------------
最終類不能被繼承,最終方法不能被重寫;
---------------------設計模式-----------
工廠方法:
file_exists--------判斷檔案是否存在;
單利模式:
關鍵點:private 構造方法,private clone方法;
構造方法私有了,只能在類內部使用,外部new的時候就不會呼叫,這樣就建立不了物件;
clone 是運算子,複製一個物件;new也是運算子;他們兩個的優先順序最高;
注意:上面 的clone $o1是運算子,不是類中預設的clone方法,在做單利的時候必須把預設的 function __clone(){}方法private,執行clone $o1 時,類中預設的clone方法才不會執行,否則,就會執行系統預設的clone方法;
構造方法,clone方法都叫魔術方法(就是系統預設的隱藏的方法);
========抽象類,抽象方法===========
抽象類專門做父類,子類繼承他;
=============過載是在同一個類中;重寫是在不同的類中;
上面:$o1->p2=2不存在,先呼叫下面一個set,然後不不存在的屬性和值存起來,然後$o1->p2不存在,又再呼叫上一個get,從而得到陣列中值;
方法過載:使用物件呼叫一個不存在的方法時。
在類中可以呼叫類外面並且不是類中的方法。
==============介面----------------
介面可以實現多繼承,類不能實現多繼承;介面的作用就是統一;
類實現介面;
一個類只能繼承一個父類,但是可以實現多個介面;
----------------自動載入技術和克隆技術--------------
第一種方法:
第二種方法:
---------------物件的複製:
淺克隆:克隆的是非物件非資源資料;
深度克隆---------------
PHP中預設克隆是淺克隆,要想一個物件的所有屬性資料都被克隆,就需要使用魔術方法__clone()裡面實現深度克隆;
物件的遍歷:
物件遍歷只能遍歷屬性:
自定義遍歷(區域性遍歷):
------------------------PHP內建標準類:
內建標準類:new stdclass();
物件型別轉換-------其他型別轉換成物件:
純字元下標的陣列才適合轉換成物件。數字下標的陣列轉成物件,不能通過數字下標訪問屬性;
標量轉換成物件:
PHP是弱型別語言,無需為變數指定型別;PHP中只能對物件,介面,陣列,函式進行約束;
型別約束:
get_class(物件)也可以獲取類名,但是必須要有一個物件;
==================資料序列化:===============
序列化:$str=serialize($變數);
將檔案儲存起來:file_put_contents("文字檔案路徑",$str);
反序列化:
類和物件的系統函式:
static 的不同用法:
多型: