[TOC]
## 魔術方法
### `__construct` 構造方法
* 構造方法
```
function __construct([參數列表])
{
方法體 //通常用來對成員屬性進行初始化賦值
}
```
****
### `__destruct` 析構方法
* 析構方法
```
function __destruct()
{
//方法體
}
```
****
### `__call()` 對象中調用一個不可訪問方法時調用
> * `string $function_name, array $arguments`
> * 第一個參數 `$function_name` 會自動接收不存在的方法名,
> * 第二個 `$arguments` 則以數組的方式接收不存在方法的多個參數。
```
/**
* 聲明此方法用來處理調用對象中不存在的方法
*/
function __call(string $function_name, array $arguments)
{
echo "你所調用的函數:" . $function_name. "(參數:" ; // 輸出調用不存在的方法名
print_r($arguments); // 輸出調用不存在的方法時的參數列表
echo ")不存在!<br>\n"; // 結束換行
}
```
****
### `__callStatic()` 用靜態方式中調用一個不可訪問方法時調用
> * 同 `__call` 的參數 一樣
```
/**
* 聲明此方法用來處理調用對象中不存在的方法
*/
public static function __callStatic($function_name, $arguments)
{
echo "你所調用的靜態方法:" . $function_name. "(參數:" ; // 輸出調用不存在的方法名
print_r($arguments); // 輸出調用不存在的方法時的參數列表
echo ")不存在!<br>\n"; // 結束換行
}
```
****
### `__get()` 獲得一個類的成員變量時調用
> * `$propertyName`屬性名作為參數傳入并處理
> * 通過它可以在對象的外部獲取私有成員屬性的值
```
/**
* 在類中添加__get()方法,在直接獲取屬性值時自動調用一次,以屬性名作為參數傳入并處理
* @param $propertyName
*
* @return int
*/
public function __get($propertyName)
{
return $this->$propertyName;
}
```
****
### `__set()` 設置一個類的成員變量時調用
>* `$property, $value` 參數名和值
```
/**
* 聲明魔術方法需要兩個參數,真接為私有屬性賦值時自動調用,并可以屏蔽一些非法賦值
* @param $property
* @param $value
*/
public function __set($property, $value)
{
$this->$property = $value;
}
```
****
### `__isset()` 當對不可訪問屬性調用`isset()`或`empty()`時調用
> * `$content` 類參數
```
/**
* @param $content
*
* @return bool
*/
public function __isset($content) {
echo "當在類外部使用isset()函數測定私有成員{$content}時,自動調用<br>";
echo isset($this->$content);
}
```
****
### `__unset()` 當對不可訪問屬性調用`unset()`時被調用。
> * `$content` 類參數
```
/**
* @param $content
*
* @return bool
*/
public function __unset($content) {
echo "當在類外部使用unset()函數來刪除私有成員時自動調用的<br>";
echo isset($this->$content);
}
```
****
### `__sleep()` 執行`serialize()`時,先會調用這個函數
> * `serialize()` 函數會檢查類中是否存在一個魔術方法 `__sleep()`
> * 如果存在,則該方法會優先被調用,然后才執行序列化操作。
> * 此功能可以用于清理對象,并返回一個包含對象中所有應被序列化的變量名稱的數組。
> * 如果該方法未返回任何內容,則 `NULL` 被序列化,并產生一個 `E_NOTICE` 級別的錯誤。
> * `__sleep()` 不能返回父類的私有成員的名字。這樣做會產生一個 `E_NOTICE` 級別的錯誤。可以用 `Serializable` 接口來替代。
> * 作用:
> `__sleep()` 方法常用于提交未提交的數據,或類似的清理操作。同時,如果有一些很大的對象,但不需要全部保存,這個功能就很好用。
```
/**
* @return array
*/
public function __sleep() {
echo "當在類外部使用serialize()時會調用這里的__sleep()方法<br>";
$this->name = base64_encode($this->name);
return array('name', 'age'); // 這里必須返回一個數值,里邊的元素表示返回的屬性名稱
}
```
****
### `__wakeup()` 執行`unserialize()`時,先會調用這個函數
> * `__wakeup()` 經常用在反序列化操作中,例如重新建立數據庫連接,或執行其它初始化操作。
```
/**
* __wakeup
*/
public function __wakeup() {
echo "當在類外部使用unserialize()時會調用這里的__wakeup()方法<br>";
$this->name = 2;
$this->sex = '男';
// 這里不需要返回數組
}
```
****
### `__toString()` 類被當成字符串時的回應方法
>* PHP 5.2.0 之前,`__toString()`?方法只有在直接使用于?`echo`或?`print`?時才能生效。
>* PHP 5.2.0 之后,則可以在任何字符串環境生效(例如通過?`printf()`,使用?`%s`?修飾符),但不能用于非字符串環境(如使用?`%d`?修飾符)。
>* 自 PHP 5.2.0 起,如果將一個未定義?`__toString()`?方法的對象轉換為字符串,會產生?`E_RECOVERABLE_ERROR`?級別的錯誤。
```
public function __toString()
{
return 'go go go';
}
```
****
### `__invoke()` 調用函數的方式調用一個對象時的回應方法
```
public function __invoke()
{
echo '這可是一個對象哦';
}
$person = new Person('小明'); // 初始賦值
$person();
```
****
### `__set_state()` 調用var_export()導出類時,此靜態方法會被調用。
> * 本方法的唯一參數是一個數組,其中包含按 array('property' => value, ...) 格式排列的類屬性
```
public static function __set_state($an_array)
{
$a = new Person();
$a->name = $an_array['name'];
return $a;
}
```
****
### `__clone()` 當對象復制完成時調用
```
public function __clone()
{
echo __METHOD__."你正在克隆對象<br>";
}
$person = new Person('小明'); // 初始賦值
$person2 = clone $person;
```
****
### `__autoload()` 嘗試加載未定義的類
> * `spl_autoload_register` 也可通過該函數注冊 自定義 加載函數
> * 魔術函數 ,跟普通函數調用方式一樣,不寫在類里面
```
/**
* 文件autoload_demo.php
*
*/
function __autoload($className)
{
$filePath = "project/class/{$className}.php";
if (is_readable($filePath)) {
require($filePath);
}
}
```
****
### `__debugInfo()` 打印所需調試信息
> * 該方法在PHP 5.6.0及其以上版本才可以用
```
/**
* @return array
*/
public function __debugInfo()
{
return [
'propSquared' => $this->prop ** 2,
];
}
```
- 簡介
- PHP
- 字符串函數
- 數組函數
- 正則
- 加密函數
- 面向對象
- 關鍵字
- 設計模式
- 魔術方法
- 機制擴展
- 會話機制
- PHP框架
- laravel
- 問題
- swoole
- easyswoole
- workerman
- 數據庫
- Sphinx
- MongoDB
- MemCache
- Redis
- 基礎操作
- 數據類型
- 持久化
- 分布式鎖
- 內存模型
- redis高級特性
- MySql
- 基礎操作
- 數據類型
- 數據表引擎
- 鎖機制
- 事務處理
- 存儲過程
- 觸發器
- 索引
- 關聯查詢
- 分析SQL語句-優化查詢
- 分區分表
- 主從復制
- MySql安全性
- 網絡協議
- HTTP
- header詳解
- 狀態碼
- nginx-配置
- 邏輯算法
- 時間和空間復雜度
- 常見算法
- 數據結構
- 核心
- 進程、線程、協程
- 存儲容量-計量單位
- 開發軟件及配置
- 版本控制器
- Git
- Fidder
- Fidder-Android7
- 自動化部署
- Jenkins
- supervisor
- Elasticsearch
- LogStash
- RabbitMQ
- AB測試
- JAVA-JDK
- FileBeat
- PhpStorm
- Composer
- Linux
- API安全
- 高并發及大流量相關概念
- 網站優化
- WEB
- Electron