常用的魔術方法有:__tostring () __call() __autoload() __ clone() __get() __set() __isset() __unset()
1.__tostring()
用於定義輸出物件引用時呼叫
常用於列印一些物件的資訊
必須有返回值
eg:有乙個
persion類
persion
per =new persion()
echo per; //
直接呼叫會出錯
我們可以在類的定義中新增
__tostring()方法
function __tostring()
2.__clone()物件的複製
引用賦值
$per1=$per2;
而這在記憶體中只有一塊位址 而
$per1=clone $per2
這時有兩塊記憶體位址
3.__call()
方法當呼叫類例項中不存在的函式時自動執行
如果試圖呼叫類中不存在的函式,會出現語法錯誤,為了能夠友好的提示
我們可以在類中宣告
call
()方法;
function __call($funname,$argu)
4.__autoload
自動載入
使用的類檔案該函式是在引用的頁面新增
我們都使用過這樣情況,在頁面中需要呼叫其他
php檔案,我們需要使用
include方法
但是如果有幾十個頁面需要引用,未免太過繁瑣,我們可以在該頁面中使用
auto
load方法
function
__autoload($classname)
這樣凡是引用到其他類的地方,都會自動引用該類檔案前提類檔案的名稱必須是類名.php
5.__get()
訪問類中私有屬性
如果類中的屬性設定為私有屬性,在類的例項中是無法訪問的,但怎樣才能訪問呢?
我們就可以使用
__get
()eg:
類中有
class person
例項化person per=new person()
per->$name; //
這樣是取不到值的
但是如果我們在類中增加
__get方法
function
__get($proname)
我們再次呼叫per->$name就可以訪問了
這樣做有人會提出疑問了,這樣可以直接訪問私有變數,和宣告成公有的有什麼區別呢?
如果宣告成公有的,我們可以任意讀取,如果是私有,如果我們增加了
get方法,那麼每次呼叫私有屬性都會呼叫
get方法的內容,這樣我們就可以在
get方法中增加一些邏輯處理。
6.__set()
設定類中的私有屬性
原理同上,我們可以再類中新增
__set()
函式,每當通過呼叫類例項給私有屬性賦值,都會執行
__set
函式,函式原型:
function
__set($proname,$value)
既然是方法賦值,我們就可以做一些邏輯處理
7.__is
set()
判斷類中私有屬性或方法是否存在時自動呼叫
首先我們先介紹一下
isset
方法,該方法用於判定屬性和方法是否存在,但是我們無法通過類類例項判斷類中的某個私有屬性是否存在
如果我們使用
isset
(per->$name);//
返回值是false,但是$name屬性的確存在,怎麼解決呢?
解決方法: 1.
將$name
定義為私有屬性 2.
在類定義中新增
function __isset($proname)
這樣的話我們再次呼叫isset($name);返回值就為true了;
8.__unset()
清除類中私有變數時自動呼叫
與之結合的是
unset
()unset
方法可以刪除屬性,當我們需要刪除類中屬性的時候,如果是公有屬性我們可以直接
刪除,但是如果是私有我們只通過該方法就無法實現了
怎樣實現呢我們可以使用
__unset()
方法實現該功能我們需要在類中新增
function __unset($proname)
現在我們再呼叫unset($name);就可以刪除person類中的私有屬性$name了
php常用魔術方法
魔術方法和建構函式 construct和複製物件時自動呼叫的函式 clone相似,都是在執行某一操作時會被呼叫,通常和乙個關鍵字相連。通常情況下在類中會定義私有屬性,這是為了保護資料而使用的措施,但是也給我們帶來了麻煩。想要修改它們的值時,是通過呼叫我們定義的介面函式來完成的。每次需要修改變數都要呼...
php常用魔術方法
1.call 當使用乙個未定義的方法時呼叫此方法 2.autoload 使用尚未被定義的類時自動呼叫。通過此函式,指令碼引擎在 php 出錯失敗前有了最後乙個機會載入所需的類加粗樣式 3.construct 當乙個物件被建立時呼叫此方法,好處是可以使構造方法有乙個獨一無二的名稱,無論它所在的類的名稱...
PHP魔術方法總結
php中的魔術方法都是以 開頭的,具有特殊作用的一些方法,可以看做php的語法糖。construct 構造器是乙個魔術方法,當物件被例項化時它會被呼叫。在乙個類宣告時它常常是第一件做的事但是沒得必要他也像其他任何方法在類中任何地方都可以宣告,構造器也能像其他方法樣繼承。如 構造方法示例,可以繼承重寫...