<?php
header('content-type:text/html;charset=utf-8');
/*
* __construct()構造方法
* 在對象初始化時自動調用
* __destruct()析構方法
* 在對象釋放資源時自動調用
* __get()取值
* 在取私有屬性值時自動調用
* __set()設置值
* 在設置私有屬性值自動調用
* __isset()判斷值
* 在使用isset()判斷私有屬性是否存在時自動調用
* __unset()釋放值
* 在使用unset()釋放私有屬性時自動調用
* __toString() 用於一個類被當成字符串時應怎樣迴應
* __call() 在對象中調用一個不可訪問方法時,__call() 會被調用。
* __callstatic()用靜態方式中調用一個不可訪問方法時,__callStatic() 會被調用。 ::
* __sleep() 在串行化serialize時自動調用的方法
* __wakeup() 在反串行化時自動調用的方法
* __set_state() 當調用 var_export() 導出類時,此靜態 方法會被調用。
* __invoke()當嘗試以調用函數的方式調用一個對象時,__invoke() 方法會被自動調用。
* __autoload() 唯一一個在類外部進行定義 自動加載 只要在這個腳本中,需要加載類的時候(必須用到類名)就會自動調用這個方法。
*
* 魔術方法的總結:
* 1.自動調用,但不同的魔術方法,有自己的調用時機
* 2.都是以__開始的方法
* 3.所有的魔術方法,方法名都是固定的
* 4.如果不寫,就不存在,也就沒有默認的功能。
*
* __toString()
* 1.是在直接使用echo print printf輸出一個對象引用時,自動調用的方法
* 2.將對象的基本信息放在__toString()方法內部,形成字符串返回。
* 3.__toString()方法中不能有參數。
*
* 克隆對象
* 1.使用clone這個關鍵字複製一個對象
*
* __clone()魔術方法
* 1.是在克隆對象時自動調用的方法
* 2.作用:和構造方法一樣,是對新克隆的對象進行初始化
*
* __call()
* 1.就是在調用一個對象中不存的方法時,自動調用的方法
* 2.有兩個參數,第一個參數是,調用的不存在的方法的方法名,第二個參數是調用不存在的方法的方法參數
* 作用:
* 1.可以寫提示信息
* 2.將方法的功能相似,但方法名還要不同的,就可以採用這個方式來完成
*
*
* 對象串行化 (序列化)
* 1.將對象轉成字符串---串行化
* __sleep()
* 作用:
* 可以設置需要串行化的對象的屬性
* 只要在這個方法中,返回一個數組,在數組中聲明瞭那個屬性名,那個屬性名就會被串行化。
* 沒有聲明的屬性名,不串行化
* 默認這個方法,全部串行化
* 2.將字符串轉成對象---反串行化
* __wakeup() 在反串行化時自動調用
* 作用:
* 對象串行化的對象回來後,進行對象的初始化,相當於__construct()
* serialize() 函數會檢查類中是否存在一個魔術方法 __sleep() 如果存在,該方法會先被調用,然後才執行序列化操作
* 注意(串行化時機)
* 1.將對象需要進行網絡傳輸時。
* 2.將對象持久保存時。
*
* 數組串行化 json ----javascript object notation
*
* 1.eval()函數--檢查並執行PHP代碼
* $str = "echo 'abc' ;";
* eval($str);
*/
class Person{
public $name;
public $age;
public $sex;
public $marr = array('eat','drink','song');
//初始化時調用構造函數
function __construct($name,$age,$sex){
$this->name = $name;
$this->age = $age;
$this->sex = $sex;
}
//echo 對象時調用
function __toString(){
return '本人的基本信息如下:我是津沙港灣,30歲,男性<br/>';
}
//clone對象時調用
function __clone(){
echo '克隆一個對象,this是一個副本<br/>';
$this->name;
$this->age=20;
$this->sex;
}
/*
//提示信息
function __call($method,$args){
echo '在調用一個對象中不存的方法時自動調用__call<br/>';
echo "調用的方法{$method}(),參數爲:";
print_r($args);
echo "不存在<br/>";
}
*/
//調用不同的方法名
function __call($method,$args){
if(in_array($method, $this->marr)){
foreach ($args as $arg)
echo $arg."<br/>";
}else{
echo "您調用的方法{$method}()不存在";
}
}
static function __callstatic($method,$args){
echo "您調用的靜態方法{$method}不存在";
}
function say() {
echo '我是津沙港灣<br/>';
}
//串行化 serialize時調用
function __sleep(){
echo '指定串行化的對象屬性名<br/>';
return array('name','age');//必須返回數組
//指定只串行化name和age這個兩個對象屬性
//O:6:"Person":2:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;}
}
//反串行化 unserialize時調用
function __wakeup(){
echo '反串行化時自動調用<br/>';
//反串行化時設置成員屬性的值
$this->age = 43;
}
//var_export導出類信息
static function __set_state($arr){//參數是數組
echo 'var_export導出類信息時自動調用<br/>';
$p = new Person("小狀元", 33, "female");
$p->name = $arr['name'];
$p->age = $arr['age'];
$p->sex = $arr['sex'];
return $p;
}
//調用函數方式調用對象 $p();
function __invoke($a,$b,$c){
echo '調用函數方式調用對象時自動調用'.$a.$b.$c.'<br/>';
}
}
//原本
$p = new Person('津沙港灣',23,'男');
//toString()
echo $p;
//__call()
$p->eat('魚','肉');
$p->drink('茶','酒');
$p->song('歌','戲');
//副本 __clone()
$a = clone $p;
echo $a->age;
//serialize 對象轉成字符串
$str = serialize($p);
//O:6:"Person":4:{s:4:"name";s:12:"津沙港灣";s:3:"age";i:23;s:3:"sex";s:3:"男";s:4:"marr";a:3:{i:0;s:3:"eat";i:1;s:5:"drink";i:2;s:4:"song";}}
file_put_contents("MrYang.txt", $str);
echo '對象串行化成功,保存到MrYang文件中';
$arr = array(
'name' => '津沙港灣',
'age' => 32,
'sex' => 'male',
);
//數組串行化{"name":"\u6d25\u6c99\u6e2f\u6e7e","age":32,"sex":"male"}
$str = json_encode($arr);
echo $str;
//數組反串行化 轉成對象
$parr = json_decode($str);
var_dump($parr);//變成一個對象
/*
object(stdClass)[1]
public 'name' => string '津沙港灣' (length=12)
public 'age' => int 32
public 'sex' => string 'male' (length=4)
*/
//變成一個對象
echo $parr->name;
//轉成數組 要加第二個參數true
$parr = json_decode($str,true);
var_dump($parr);
//var_export __set_state()
$p = new Person("津沙港灣", 20, "male");
//設定的屬性可以傳到$arr中去
$p->name = '火山島';
$p->age = 500;
$p->sex = 'male';
eval('$b='.var_export($p,true).';');//加ture變成字符串
var_dump($b);//類信息以__set_state()中設定值爲準
//調用函數方式
$p(1,2,3);
//__callstatic 調用不存在的靜態方法時自動調用
Person::speak();
//__autoload 調用類中的方法時自動加載類文件
function __autoload($classname){
include $classname.'.class.php';
}
Test::laugh();
對象反串行化
include 'index.php';
//讀取文件內容 字符串
$str = file_get_contents('MrYang.txt');
//反串行化 字符串轉成對象
$p = unserialize($str);
$p ->say();
echo $p->age;