1. 程式人生 > >PHP面向物件(一)

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 的不同用法:

多型: