1. 程式人生 > >PHP筆記(二)

PHP筆記(二)

ace des int san under 另一個 set 第一個 line

(一)自動加載

魔術方法總結
__construct():構造函數,new一個對象的時候自動調用,為實例化的對象賦初值等操作
__destruct():析構函數,對象被註銷的時候自動調用,可以打印出些東西來


__get():只要是訪問對象的私有屬性(無論內外),都會自動調用,傳遞需要讀取的屬性名,切記要return回來這個屬性名
__set():只要是修改對象的私有屬性(無論內外),都會自動調用,傳遞需要修改的屬性名,切記要return回來這個屬性名


__unset():刪除對象的私有屬性時自動調用,傳入被刪除的屬性名,在函數裏再寫一遍unset函數
__isset():使用isset檢測對象的私有屬性時自動調用 ,傳遞被檢測的屬性名。返回isset屬性名


__toString():使用echo打印對象的時候,自動調用。顯示想要現實的內容,一般寫個定界符的變量。註意返回字符串
__call():當調用未公開的(即私有的不存在)的函數時,自動調用,傳入 被調用函數的名,和一個數組,裏面放的參數列表
__clone():使用clone克隆對象時,並可以對新克隆出來的對象賦初值。
__sleep():對象串行化時,自動調用。返回一個數組,數組元素就是我們需要串行化的屬性
__wakeup():對象反串行化時,自動調用。對反串行化的屬性賦初值。
__autoload():最重要的。在類的外部調用,而且當調用不在本文檔中的類時,會自動導入對應的類文件

1.自動加載


function __autoload($className){
include strtolower($className).".class.php";
}
註意
這個會在實例化一個對象的時候,如果用到的類不在當前文件,那就會自動調用這個函數。如果存在了,就不會調用這個函數。
這個導入對於同一個類文件只會導入一次,導入一次之後,類就已經拷貝過來了,相當於在類中了,再實例化,就不調用他了
切記,以後 類文件 都寫入到一個專門的文件夾中,而且格式必須同一,完全小寫,特別是類名,必須小寫,別忘了
include strtolower($className).".class.php"; 註意格式,2個點一定不能忘了

這個在實例化時,會自動將不存在的類名寧當作參數傳給 __autoload();然後我們把他strtolower轉小寫,拼串


2.對象的序列化與反序列化。也叫 串行化和反串行化
serialize串行化;unserialize反串行化
$str=serialize($lisi); 他就是把對象轉換成 一溜 字符串的形式 ,這樣就可以用echo打印了
echo $str."<br/>";
$str1=unserialize($str); 將已經序列化的對象使用反序列化函數轉變回來,又成為了一個對象了。
var_dump($str1);


使用串行化的情況
對象數據需要在網絡中傳輸的時候;
對象數據需要寫在文件中,在數據庫中長期保存對象數據。


3. __sleep
當執行對象串行化的時候,也就是調用serialize函數的時候。會自動執行__sleep函數,而且他需要返回一個數組
數組裏寫了哪些成員屬性,那些成員屬性就可以串行化。註意,當數組裏不寫屬性,就是所有屬性都不串行化。如果不寫
__sleep函數就是默認所有的屬性都串行化。


4. __wakeup
當執行對象反串行化的時候,也就是調用unserialize函數的時候。會自動執行__weekup函數,他可以為反串行化
的屬性重新賦值
function __wakeup(){
$this->name="王文彥";
}
$b=unserialize($a);
echo $b->name; 這個就打印出 王文彥來了


5.類型約束
指在變量前加上數據類型,用於強制約束此變量的類型,使這個變量只能接收這種類型的數據,其他類型無法接收
function func(array $a){
var_dump($a);
}
func(["aaa",1]);
註意:只有 數組和對象才能進行類型約束,其他的 Number、String等在PHP中是不行的,其他強語言可以

function func(array $a){
echo $a->name;
}
func(new Student("桑桑",15,"女生"));
註意,如果是類的話,只能 是對應的類和這個類的子類
註意:在PHP中,數據約束只用在 函數形參 中,其他地方是不能使用的,會報錯。
new Student();這是直接創建了一個 匿名對象,就是沒賦給變量而已,存在,但是咱不好找

(二)抽象類

對象串行化
1. clone和__clone
引用數據類型,傳遞的是地址,所以改一個,另一個也變。
但是通過clone將一個對象完全克隆出另一個對象,這兩個對象是獨立的,互不幹擾的。
$lisi= clone $zhangsan; 當外部對象使用clone關鍵字的時候,會自動調用__clone魔術方法。
__clone函數,類似於克隆時調用了一遍構造函數,可以給新的克隆的對象的屬性賦新值,不寫,就是賦的原來被克隆對象的值
__clone函數裏的$this指的是當前,新的對象

2. __toString函數
echo $lisi;當使用echo等輸出語句,打印對象的時候,就會自動調用__toString函數,並打印出這個函數內return回來的東西。
3. __call函數
$zhangsan->say1(1,2,3); 當調用未定義的函數、或者私有的函數時,會自動調用這個魔術函數
function __call($name,$canshu){
echo "您調用的函數未定義";
var_dump($name); //直接打印出第一個形參
var_dump($canshu); //直接打印出第二個形參
} 第一個參數 是我們調用的函數的名,第二個參數是數組,是我們我們調用此方法是傳的參數

(三)接口

【抽象類】
1.什麽是接口?
接口是一種規範,提供了一組實現接口的類所必須實現的方法組合,
接口使用interface關鍵字聲明;

interface Inter{}

2.接口中的所有方法,必須都是抽象方法。
接口中的抽象方法不需要也不能使用abstract修飾

3.接口中不能聲明變量,不能有屬性,只能使用常量!!!
const NUM = 10;

4.接口可以繼承接口,使用extends關鍵字!
接口使用extends繼承接口,也不能實現多承。
interface int1 extends Inter{}

5.類可以實現接口,使用implement關鍵字!
類使用implement實現接口,可同時實現多個接口,多個接口間使用逗號分隔;
class Person implements Inter,inter2{}

一個類實現一個或多個接口,那麽這個類必須實現所有接口中的所有抽象方法!除非,這個類是抽象類

【接口與抽象類區別】
1、聲明方式上,接口使用interface關鍵字,抽象類使用abstract class
2、實現/繼承方式上,一個類使用extends繼承抽象類,使用implement實現接口
3、抽象類只能單繼承,接口可以多繼承(接口extends接口)多實現(類implement接口);
4、抽象類中可以有非抽象方法,接口中只能有抽象方法,不能有非抽象方法;
抽象類中的抽象方法必須使用abstract關鍵字修飾,接口中抽象方法不能帶修飾詞;
5、抽象類是個類,可以有屬性、變量;接口中只能有常量

(四)多態

【多態】
1、一個類,被多個子類繼承。如果,這個類的某個方法,在多個子類中,表現出不同的功能,我們稱這種行為為多態

2、實現多態的必要途徑
①子類繼承父類;
②子類重寫父類方法;
③父類引用指向子類對象;

PHP筆記(二)