## 說明
魔術方法就是在特定場景下不需要調用而自動執行的方法。因為有魔術方法,所以我們的類可以寫得很靈活~
```
__construct #構造方法,在類被實例化時自動調用,一般用于初始化操作;
__destruct #析構方法,對象被銷毀時自動調用;
__clone() #克隆方法,當對象被克隆時,將會自動調用
__get($key) #屬性獲取方法,當對象要調用一個被保護或不存在的屬性時,__get方法就會自動被調用,并傳入調用的屬性名稱;
__set($key,$val) # 屬性設置方法,當對象設置一個被保護或不存在的屬性時,__set會被執行,并傳入要設置的屬性名稱和屬性值,注意這里的設置令對象本身沒有發生改變,除非更改操作是發生在__set方法內;但無論如何,都不可以為對象增加本來就沒有的屬性,只有對已有的屬性進行操作;
__isset($key) # 當用isset判斷一個對象是否有這個屬性,并且這個屬性是被保護或者不存在時被自動執行,并傳入判斷的屬性名稱;
__unset($key) # 同上,當用unset刪除一個對象的保護屬性或未存在的屬性時,自動被執行;
__isset($key) #__isset方法如果返回一個為true的值時,isset的判斷就會失效,不管本類有沒有其判斷的屬性,isset都會返回真;
__call($method,$arguments) # 當對象在調用一個被保護或不存在的方法時,會自動執行,并傳入兩個參數$method為方法嗎,$arguments為該方法的參數數組;
__callStatic($method,$arguments) # 當調用了類當中某個被保護或不存在的靜態方法時,會自動執行,并傳入兩個參數$method為方法,$arguments為該方法的參數數組;注意,是靜態方法,并且是php5.3新增的魔術方法;
__toString() # 輸出對象引用時自動調用;
__invoke() # $obj = class();$obj()時執行該函數
__sleep() # 在類序列化時調用
__wakeup() # 在類反序列化時調用
```
```php
<?php
#魔術方法概覽:
class magic{
private $privateProperty = "被保護的屬性";
public function __construct(){
echo "我是魔術構造方法,本類被實例化的時候我就會自動執行" . "<hr />";
}
public function __toString(){
echo 'hahaha,我是toString';
return $this -> privateProperty;
}
public function __invoke(){
echo '類被實例為對象后,可以直接當做方法調用,調用的就是我~';
}
public function func(){
echo "這是一個普通的方法 <br />";
}
private function privateFunc(){
echo "這是一個被保護的方法 <br />";
}
public function __destruct(){
echo "我是析構方法,在對象被銷毀(代碼執行完、\$obj被賦值為NULL或被unset)時,我會被自動調用 <br />";
echo "<strong>貌似對象被克隆的時候,我也會自動執行</strong><hr />";
}
public function __clone(){
echo "我是克隆魔術方法,當對象被clone時,我會被自動執行. <hr />";
}
public function __get($key){
echo "我是__get方法,當對象調用一個被保護或不存在的屬性時,我會被執行,并傳入調用的屬性名稱 -> {$key} <hr />";
}
public function __set($key , $val){
echo "我是__set方法,當對象設置一個被保護或不存在的屬性時,我會被執行,并傳入要設置的屬性名稱->\"{$key}\"和屬性值->\"{$val}\";<br /><strong>注意,這里的設置并沒有令對象本身的屬性值發生改變或增加</strong> <hr />";
/*
__set方法的使用:
1.利用本方法預留一個接口,有條件的限制類外部操作類內部被保護的屬性;
2.框架中一般private一個$data的數組,用set方法對其增加數組元素,然后來操作這個數組;
*/
}
public function __isset($key){
echo "我是__isset方法,當isset判斷對象的被保護或不存在屬性時,我會被執行,并傳入被判斷的屬性名稱 ->\"{$key}\" <br />
<storng>注意,本方法如果返回一個為true的值時,isset的判斷就會失效,不管本類有沒有其判斷的屬性 ->\"{$key}\",都會返回真</storng>
<hr />";
return true;
}
public function __unset($key){
echo "我是__unset方法,當unset對象的被保護或不存在屬性時,我會被執行,并傳入要被unset的屬性名稱 ->\"{$key}\" <hr />";
}
public function __call($method , $arguments){
echo "我是__call方法,當對象在調用一個被保護或不存在的方法時,我會被調用,并傳入兩個參數,\$method ----> \"{$method}\"(方法名); \$arguments ---->(參數數組)";
print_r($arguments);
echo "<hr />";
}
public static function __callStatic($method , $arguments){
echo "我是__callStatic方法,當調用了類當中某個被保護或不存在的靜態方法時,我會被調用,并傳入兩個參數,\$method ----> \"{$method}\"(方法名); \$arguments ---->(參數數組)";
print_r($arguments);
echo "<strong>注意:只能是類::staticMethod,并且本方法是php5.3版本才更新的</strong>";
echo "<hr />";
}
}
$obj = new magic();
# __invoke
$obj(); //5.3以后這樣搞就等于是直接調用類里面的__invoke()方法
# __toString
//如果沒有__toString就會報錯;Object of class magic could not be converted to string
//但是有__toString方法的話,不僅toString方法會被調用,并且還會返回toString中返回的值;
echo $obj;
# __clone;
// $obj1 = clone $obj;
#__get($key)獲取保護和不存在的屬性↓↓;
$obj->privateProperty; //調用被保護的屬性;
$obj->zxg; //調用不存在的屬性;
#__set($key,$val)設置保護和不存在的屬性↓↓:
print_r($obj);
echo " <hr />";
$obj->privateProperty = "通過__set方法改變了屬性值;";
$obj->zxg = "xgg"; //未存在的屬性;
print_r($obj);//$obj本身沒有發生改變,除非更改操作是發生在__set方法內;但無論如何,都不可以為對象增加屬性,只有對已有的屬性進行操作;
echo " <hr />";
#__isset($key)方法的使用
echo isset($obj->jyh) ? "有jyh屬性(事實上是沒有這個屬性的,但__isset方法返回真,其就為真)" : "沒有jyh屬性";
echo " <hr />";
#__unset($key)方法的使用
unset($obj->zxg);
#__call($method,$arguments)
$obj->privateFunc('arg1' , 'arg2' , 'arg3');
#__callStatic($method,$arguments)
magic::zhouzhou(27 , 'pig');
?>
```
- 現代化PHP特性
- php7常用特性整理
- 反射機制Reflection
- 依賴注入與服務容器
- 抽象類與接口
- 類多繼承的替代方案Traits
- 類的延遲綁定(后期綁定)
- 生成器語法
- 匿名函數和閉包
- 匿名類
- 理解php的output buffer
- 斷言ASSERT
- 魔術方法小結
- Zend Opcache字節碼緩存
- 內置的http服務器
- SPL標準庫
- 【SPL標準庫專題(1)】SPL簡介
- 【SPL標準庫專題(2)】Iterator
- 【SPL標準庫專題(3)】Classes
- 【SPL標準庫專題(4)】Exceptions
- 【SPL標準庫專題(5)】Datastructures:SplDoublyLinkedList
- 【SPL標準庫專題(6)】Datastructures:SplStack & SplQueue
- 【SPL標準庫專題(7)】Datastructures:SplPriorityQueue
- 【SPL標準庫專題(8)】Datastructures:SplHeap & SplMaxHeap & SplMinHeap
- 【SPL標準庫專題(9)】Datastructures:SplFixedArray
- 【SPL標準庫專題(10)】Datastructures:SplObjectStorage
- PHPcomposer使用手札[ing]
- PHP中的多態
- 通過命名空間實現自動加載的框架雛形
- 日期與金額
- PHPstorm使用攻略
- 筆記本