PHPの__sleepと__wakeup

巴扎黑
リリース: 2016-11-23 11:55:02
オリジナル
1229 人が閲覧しました

phpでは、__sleepと__wakeupはそれぞれオブジェクトのシリアル化の前後に呼び出されるメソッドです。このうち、__sleepはパラメータを受け取りませんが、配列を返します。次の例のように、どの属性をシリアル化する必要があるか:

class Customer { private $name; private $credit_card_number; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setCC($cc) { $this->credit_card_number = $cc; } public function getCC() { return $this->credit_card_number; } public function __sleep() { return array(“name”); //只有name会序列化 } } $c = new Customer(); $c->setName(“Stuard”); $c->setCC(“456789″); $data = serialize($c).”\n”; echo $data.”\n”; Output: O:8:”Customer”:1:{s:14:” Customer name”;s:5:”Stuard”;}
ログイン後にコピー

上記のシリアル化の前に、__sleep は name 属性のみがシリアル化されるように指定しましたが、creaditcard はシリアル化されません。


逆に、次の例のように、__wakeup は逆シリアル化の前にトリガーされます。

class Customer { private $name; private $credit_card_number; public function setName($name) { $this->name = $name; } public function getName() { return $this->name; } public function setCC($cc) { $this->credit_card_number = $cc; } public function getCC() { return $this->credit_card_number; } public function __sleep() { return array(“name”); } public function __wakeup() { if($this->name == “Stuart”) { //重新在数据库中获得 $this->credit_card_number = “1234567890123456″; } } } $c = new Customer(); $c->setName(“Stuart”); $c->setCC(“1234567890123456″); $data = serialize($c).”\n”; var_dump(unserialize($data)); Output: object(Customer)#2 (2) { ["name:private"]=> string(5) “Stuart” ["credit_card_number:private"]=> string(16) ’1234567890123456³ }
ログイン後にコピー

上記のコードでは、シリアル化中に __sleep が使用されるため、creadit Cardnumber 属性はシリアル化されません。そのため、逆シリアル化では、unserialize を呼び出す前に、たとえば、ここではデータベース内のデータを再取得してから操作を実行できます


関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!