
批改狀態(tài):合格
老師批語(yǔ):
__sleep()
用serialize關(guān)鍵字序列化時(shí)被自動(dòng)調(diào)用的魔術(shù)方法
__wakeup()
用unserialize關(guān)鍵字反序列化時(shí)被自動(dòng)調(diào)用的魔術(shù)方法
案例1:
<?php
//序列化
//echo serialize('孫悟空');
//echo serialize([1,2,3,true,null]);
class User
{
public $name = '遙控飛機(jī)';
public $price = 4000;
public $num = 3;
//序列化時(shí)自動(dòng)調(diào)用__sleep()魔術(shù)方法
public function __sleep():array
{
return ['name','price','num'];
}
//反序列化時(shí)自動(dòng)調(diào)用
public function __wakeup()
{
$this->price = 1000;
}
}
$user = new User();
echo serialize($user),'<br>';
//序列化數(shù)據(jù)的目的是將數(shù)據(jù)進(jìn)行傳輸保存
file_put_contents('obj.txt',serialize($user));
$str = file_get_contents('obj.txt');
echo gettype($str).'<br>';
//反序列化
$obj = unserialize($str);
echo gettype($obj).'<br>';
echo $obj->name . ':價(jià)格:' . $obj->price . ',數(shù)量:' , $obj->num;
案例2:
<?php
//__sleep()和__wakeup()實(shí)戰(zhàn)
//自定義數(shù)據(jù)庫(kù)連接類
//功能
//1.類實(shí)例化,自動(dòng)連接數(shù)據(jù)庫(kù),一定會(huì)生成一個(gè):連接對(duì)象
//2.將這個(gè)連接對(duì)象序列化,獲取到連接參數(shù)
//3.反序列化,自動(dòng)重新連接數(shù)據(jù)庫(kù)
//連接類
class Connection
{
//數(shù)據(jù)庫(kù)連接參數(shù)
private $params = [];
//連接對(duì)象
private $link;
//構(gòu)造方法
public function __construct($dsn,$username,$password)
{
//1.連接參數(shù)的初始化
$this->params['dsn'] = $dsn;
$this->params['username'] = $username;
$this->params['password'] = $password;
$this->connect();
//2.連接數(shù)據(jù)庫(kù)
//$this->link = new PDO(...$this->params);
}
//連接數(shù)據(jù)庫(kù)
public function connect()
{
//array_values()把關(guān)聯(lián)數(shù)組轉(zhuǎn)換為索引數(shù)組
$this->link = new PDO(...array_values($this->params));
}
//將這個(gè)連接對(duì)象序列化,獲取到連接參數(shù)
public function __sleep():array
{
return ['params'];
}
//反序列化,自動(dòng)重新連接數(shù)據(jù)庫(kù)
public function __wakeup()
{
$this->connect();
}
public function select($sql)
{
return $this->link->query($sql)->fetchAll(PDO::FETCH_ASSOC);
}
}
$dsn = 'mysql:host=localhost;dbname=tp5';
$username = 'root';
$password = 'wang1111';
$db = new Connection($dsn,$username,$password);
//var_dump($db);
$str = serialize($db);
echo $str.'<hr>';
//print_r(unserialize($str));
print_r($db->select('SELECT * FROM user LIMIT 3'));
echo '<hr>';
//3.反序列化,自動(dòng)重新連接數(shù)據(jù)庫(kù)
$link = unserialize($str);
print_r($link);
__toString()
方法用于一個(gè)類被當(dāng)成字符串輸出時(shí)自動(dòng)調(diào)用該魔術(shù)方法
<?php
//tostring()
class User
{
public function __toString()
{
return 'Hello';
}
}
//將這個(gè)類的實(shí)例,當(dāng)成字符串打印
$user = new User();
echo $user;
class DbException extends PDOException
{
public function __toString()
{
return <<< DBE
<table border="1px">
<tr>
<td>編號(hào)</td>
<td>信息</td>
<td>文件</td>
<td>行號(hào)</td>
</tr>
<tr>
<td>$this->code</td>
<td>$this->message</td>
<td>$this->file</td>
<td>$this->line</td>
</tr>
</table>
DBE;
}
}
try{
$db = new PDO('mysql:host=localhost;dbname=tp5','root','wang11112');
}catch(PDOException $e){
$error = new DbException('連接錯(cuò)誤',1001);
echo $error;
}
匿名類可以創(chuàng)建一次性的簡(jiǎn)單對(duì)象
可以傳遞參數(shù)到匿名類的構(gòu)造器,也可以擴(kuò)展(extend)其他類、實(shí)現(xiàn)接口(implement interface),以及像其他普通的類一樣使用
<?php
//匿名類的應(yīng)用場(chǎng)景
//1.實(shí)現(xiàn)接口的部分功能
interface iDb
{
public function __construct(...$params);
}
//當(dāng)前這個(gè)接口中的數(shù)據(jù)連接操作應(yīng)該支持PDO,mysqli
//mysqlu實(shí)現(xiàn)
class My_mysqli implements iDb
{
private $db = null;
public function __construct(...$params)
{
$this->db = new mysqli($params[0],$params[1],$params[2],$params[3]);
echo '數(shù)據(jù)庫(kù)連接成功';
}
public function select()
{
return $this->db->query('SELECT * FROM user LIMIT 2')->fetch_all(MYSQLI_ASSOC);
}
}
$mysqli = new My_mysqli('localhost','root','wang1111','tp5');
print_r($mysqli->select());
echo '<hr>';
//匿名類實(shí)現(xiàn)
$users = ( new class ('localhost','root','wang1111','tp5') implements iDb{
private $db = null;
public function __construct(...$params)
{
$this->db = new mysqli($params[0],$params[1],$params[2],$params[3]);
echo '數(shù)據(jù)庫(kù)連接成功';
}
public function select()
{
return $this->db->query('SELECT * FROM user LIMIT 2')->fetch_all(MYSQLI_ASSOC);
}
})->select();
print_r($users);
echo '<hr>';
//用pdo來實(shí)現(xiàn)
class My_pdo implements iDb
{
private $db = null;
public function __construct(...$params)
{
$this->db = new PDO($params[0],$params[1],$params[2]);
echo '數(shù)據(jù)庫(kù)連接成功';
}
public function select()
{
return $this->db->query('SELECT * FROM user LIMIT 1')->fetchAll(PDO::FETCH_ASSOC);
}
}
$mypdo = new My_pdo('mysql:host=localhost;dbname=tp5','root','wang1111');
print_r($mypdo->select());
echo '<hr>';
//用匿名類來實(shí)現(xiàn)
$users2 = ( new class ('mysql:host=localhost;dbname=tp5','root','wang1111') implements iDb{
private $db = null;
public function __construct(...$params)
{
$this->db = new PDO($params[0],$params[1],$params[2]);
echo '數(shù)據(jù)庫(kù)連接成功';
}
public function select()
{
return $this->db->query('SELECT * FROM user LIMIT 2')->fetchAll(PDO::FETCH_ASSOC);
}
})->select();
print_r($users2);
echo '<hr>';
序列化時(shí)自動(dòng)調(diào)用__sleep()
魔術(shù)方法
反序列化時(shí)自動(dòng)調(diào)用__wakeup()
魔術(shù)方法
當(dāng)echo一個(gè)實(shí)例化的類時(shí),自動(dòng)調(diào)用__toString()
魔術(shù)方法
匿名類,沒有名稱的類,通常賦值給一個(gè)變量
微信掃碼
關(guān)注PHP中文網(wǎng)服務(wù)號(hào)
QQ掃碼
加入技術(shù)交流群
Copyright 2014-2025 http://ipnx.cn/ All Rights Reserved | php.cn | 湘ICP備2023035733號(hào)