標籤:size 運行 new bsp 另一個 解構函式 clu 常用 set
PHP物件導向中有很多功能很強大,不得不說的就是魔術方法了。今天抽出時間記錄幾個比較常用的魔術方法:
1.__construct 這是建構函式,指當一個類被執行個體化的時候就會自動調用的函數。那我們可以在這裡初始設定變數的值。例如:
class Score{ public $chinese; public $english; public $math; public function __construct($chinese=100,$english=99,$math=98) { $this->chinese=$chinese; $this->english=$english; $this->math=$math; } public function show(){ echo "chinese:{$this->chinese},english:{$this->english},math:{$this->math}"; }
這個時候,我們可以執行個體化一個Score對象出來,接著調用Score類的show方法,例如:
$stu = new Score();$stu->show();
我們執行個體化一個對象,沒有傳值,這個時候列印出來就是
chinese:100,english:99,math:98
2.__destruct 解構函式。顧名思義,他的作用和建構函式是對立的,當對象被銷毀時,析構方法會運行,或者明確的說當我們不再使用它時,php會為我們清理掉。
public function __destruct() { echo "我被摧毀了{$this->math}";
}
3.__set ()賦值,給屬性賦值,接著用另一個魔術方法__get()來取值
class User{ private $name; private $age; /*****__set():賦值****/ function __set($name,$value) { if($name == "age"){ if($value <18){ $this->age = 18; }else{ $this->age = $value; } }else{ $this->$name = $value; } }}
4.__get();取值,當__set()方法給某些屬性賦值之後,這時候可以用__get()取賦值之後的任意屬性,方法如下:
class User{ private $name; private $age; /****__get():取值***/ function __get($name) { if($name == "name"){ return "dog"; }else{ return $this->$name; } }}
5.__isset();判斷是否是這個屬性;噹噹前屬性被isset()或者empty(),即當某個屬性被檢驗空的方法調用的時候,會觸發這個方法
class User{ private $name; private $age; public function __isset($name) { echo "{$name}isset被調用了"; }}
調用方法如下:
$user = new User();$user->name = "房明";isset($user->name);
6.__unset();銷毀這某個屬性;
class User{ private $name; private $age; function __unset($name) { echo "{$name}被銷毀了"; //防止被銷毀的時候直接寫一個return即可; }}
調用方法如下:
$user = new User();$user->name = "房明";unset($user->name);
7.__clone():複製的時候會調用__clone方法;
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //複製的時候會調用__clone方法 public function __clone() { $this->age = 0; } }
調用方法如下:
$four = new Four("zhq",18);$four2 = clone $four; //此時的$four2調用的是__clone方法,所以此時年齡會變為0
8.__call:當類裡面沒有方法的時候會調用__call方法;
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //當類裡面沒有方法的時候會調用__call方法 function __call($name, $arguments) { echo "沒有{$name}這個方法,不能這麼玩"; } }
調用方法如下:
$four = new Four("zhq",18);$four ->show();//類中沒有這個方法,就會調用__call方法
9.__tostring();當echo的時候會調用__toString方法;
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //當echo的時候會調用__toString方法; $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}"; return $stu; }
調用方法如下:
$four = new Four("zhq",18);echo $four;echo 執行個體化出來的時候,就直接調用tostring方法
10.__autoload:自動載入,當類路徑找不到的時候會調用__autoload方法,這個方法很好的解決了需要引用多個include_once的問題;
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //當echo的時候會調用__toString方法; $stu = "chinese:{$this->chinese},english:{$this->english},math:{$this->math}"; return $stu; }
若在另一個頁面調用Four類;不需要再用include_once Four;為了避免代碼重複,則有以下方法
function __autoload($name){ $path = $name.".class.php"; include_once $path;}//這個時候不需要引入Four類,這就可以直接執行個體化一個對象
11.__sleep():當對象被序列化那一瞬間調用這個函數
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //當對象被序列化那一瞬間 function __sleep() { // TODO: Implement __sleep() method. echo "我要睡著了<br>"; return array(‘name‘,‘age‘); }}
這個時候我們可以將對象進行序列化的時候,就調用了__sleep()方法;
$four = new Four("zhq",18);
//將對象進行序列化$four1=serialize($four);
//將檔案寫入字串file_put_contents("score.txt",$four1);
12.__wakeup():將對象進行反序列化的時候調用這個函數
class Four{ public $name; public $age; public function __construct($name,$age) { $this->name = $name; $this->age = $age; } //當對象被反序列化那一瞬間 public function __wakeup() { echo "我又回來了<br>"; // TODO: Implement __wakeup() method. } }
這個時候我們可以將對象進行反序列化的時候,就調用了__wakeup()方法;
//讀取檔案$four= file_get_contents("score.txt");$obj = unserialize($four);
目前先記錄這些基本的魔術方法,不知道有沒有錯誤,希望大家來指正,虛心學習,積累知識!謝謝,以後還會在增加其他的魔術方法。
php中常用到的魔術方法