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 的不同用法:
多態:
PHP中控制檯輸出的幾種方法:
var_dump();
printf();
echo ‘’;echo“ “;
===========資源與對象的辨析=========
資源是本來就存在的,直接從外部得到的;
對象是人工創造出來的;
$link=mysqli_connect("localhost","root","123");得到一個鏈接到mysql數據庫的資源;
$result =mysql_query();這個是結果集資源;
類實例化的過程:
對象的屬性是各個對象的,方法是共有的,只有一個方法;
靜態屬性:
類存在的時候,靜態屬性就已經在數據區了,跟類實例化沒關係;
繼承:
======$this ,在子類對象調用繼承自父類的方法時,方法中的$this 是子類的對象;
訪問限制:依賴於源代碼的結構,而不是依賴於對象,繼承和訪問的關係不是一件事;私有成員可以被繼承;
子類中定義的靜態成員變量是不能被父類調用的;只能在繼承鏈上向下調用,不能向上調用;
abstact:抽象類不能實例化,可以被繼承;
抽象方法包含於抽象類中,繼承抽象類的子類,必須實現父類抽象類中的抽象方法;
final:最終類不能再被繼承;最終方法不能再重寫;
====toString()====吧對象當做字符串用(如直接echo 對象),或者把對象轉成字符串時調用((string)對象)。
==========當訪問不存在或不可訪問的方法時,就會重載;
默認的處理方式:
不存在的,會自動增加;
訪問限制符,限制的,不能處理;
判斷屬性名是否存在:property__exists(對象,屬性);