PHP進階特性基礎
php對象在記憶體中的地區:php對象名和對象存放的位置是不一樣的,這一點和java是一模一樣的,所以在php物件導向部分你完全可以套用java的思想去做。對象存放在堆區(heap)而對象名則和其他普通變數一樣存放在棧裡面。注意對象名本身是一個指向對象的引用,也就是它的值其實是它所指向的對象的地址,所以你可以更改它指向的對象來使它指向完全不同的對象,同理,一個對象可以有多個對象名,但要注意,通過修改其中的一個對象名的成員屬性就會導致其他對象名所指向的成員屬性也發生變化。
基本類型變數和對象名是存放在桟區的,而對象是存放在堆區的。然後對象名是引用,也就是值是地址,而基本類型變數只有添加&地址符才表示地址。注意this關鍵字的運用,特別是區分類的成員變數和成員函數裡的局部變數。
php的構造方法:
在php5中新添加的構造方法形式為function __construct($num1);而在php4中構造方法是以類名為構造方法名,這一點類似於java。可以寫兩個構造方法,但執行的時候只會選擇其中一個,建議用php5的構造方法形式。在成員方法中如果直接寫變數,而沒有在變數前加上$this->那麼這個變數就是一個活躍在方法內的局部變數,而在方法結束了這個變數就釋放了。所以要在方法裡面使用,一定要記得this關鍵字。注意不能重載預設構造方法,即不能這樣寫function __construct()這個方法是預設的構造方法。一個類只能有一個構造方法。但版本不同的構造方法可以共存。
而且建立對象和你寫的構造方法一定要相對應。
php的析構方法:
形式:function __destruct(){
//釋放資源操作
}
類似於C++,作用是用於釋放資源,回收變數所佔用的記憶體資源,銷毀某個對象。預設的銷毀對象順序和建立對象順序相反,這一點和棧相關,越晚被建立,越早被銷毀。建立對象是入棧,銷毀對象操作時出棧。
注意將對象置NULL時是為了銷毀對象,而這個對象有多個變數指向這個對象,那麼這個對象並不會被銷毀。例如
$pig =new Pig();
$pig2=$pig;
$pig=null;
該對象並沒有被置空,因為還有一個變數指向這個對象。
static和global變數都是存放在”全域區/待用資料區”。訪問靜態變數用self::關鍵字首碼。其實也可以其他類的靜態方法,形式為:
類名::靜態方法名字,訪問父類的構造方法或靜態方法用parent::方法名 形式;
在php中靜態方法只能操作靜態變數,不能操作成員變數,而成員方法既可以操作靜態變數也可以操作成員變數。
php函數只允許覆蓋,不允許重載。即不能有同名函數。
unset一個引用變數時,unset銷毀的是指向對象的變數,而不是這個對象。
成員方法預設是public的,而成員屬性預設是private的。
php中多態的實現;
php中多態的實現過程和其他進階語言不一樣,它是通過魔術函數__call()實現的;該函數用在系統調用一個對象的方法時該方法名不存在,就會調用__call()函數,多態不建議使用。