前回の記事「PHPのビルダーパターンの詳細分析」ではPHPのビルダーパターンについて紹介しましたが、次の記事ではPHPデザインパターンのメモパターンについて理解していきます。
メモ、この名前は実際にその機能を非常にわかりやすく説明しています。典型的な例は、もともとハードディスクゲームをプレイしたときのアーカイブ機能です。これから直面する大きなボスが心配なときは、通常、最初に進行状況のアーカイブを保存します。挑戦に失敗した場合は、アーカイブを直接読み込んでBOSSに挑戦する前の状態に戻すことができ、しばらく楽しく練習して再び大BOSSを解くことができます。ただし、念のため、BOSS に挑戦する前にファイルを保存しておくことをお勧めします。もう 1 つの例は、プログラマーが毎日使用するコード管理ツールである Git または Svn です。各提出はアーカイブのバックアップのようなもので、新しいコードに問題がある場合は、ロールバックして回復するだけです。これらはメモモードの代表的な応用例ですので、一緒に見ていきましょう。
Gof クラス図と説明
GoF 定義: カプセル化を破壊することなくオブジェクトの内部状態をキャプチャし、この状態をこの外部に保存します。物体。このようにして、オブジェクトを元の保存状態に復元できます
#GoF クラス図:
class Originator
{
private $state;
public function SetMeneto(Memento $m)
{
$this->state = $m->GetState();
}
public function CreateMemento()
{
$m = new Memento();
$m->SetState($this->state);
return $m;
}
public function SetState($state)
{
$this->state = $state;
}
public function ShowState()
{
echo $this->state, PHP_EOL;
}
}
発信者は開始者とも呼ばれます。さまざまな状況下で変化する可能性のある内部状態があります。イベントが発生すると、この状態を元の状態に戻す必要があります。ここでは、メモ (アーカイブ) を作成するための CreateMemento() と、状態を復元する (ファイルの読み取り) ための SetMeneto() があります。
class Memento { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } }
メモは非常にシンプルで、ステータスを記録するために使用されます。この状態をオブジェクトの形式で保存すると、作成者はさまざまな状態を記録する多数のアーカイブを簡単に作成できます。
class Caretaker { private $memento; public function SetMemento($memento) { $this->memento = $memento; } public function GetMemento() { return $this->memento; } }
マネージャークラスとも呼ばれる担当者はメモを保存し、必要なときにここからメモを取り出します。保存のみを担当し、メモを変更することはできません。複雑なアプリケーションでは、プレイヤーが選択できる複数のアーカイブ レコードを選択的に表示できるゲームと同様に、これをリストにすることができます。
$o = new Originator(); $o->SetState('状态1'); $o->ShowState(); // 保存状态 $c = new Caretaker(); $c->SetMemento($o->CreateMemento()); $o->SetState('状态2'); $o->ShowState(); // 还原状态 $o->SetMeneto($c->GetMemento()); $o->ShowState();
クライアント呼び出しで、発信者は状態を初期化して保存し、その後状態を人為的に変更しました。このときは担当者を通じてステータスを復元するだけで済みます。
端的に言えば、メモ モードは、外部クラス B に A の内部状態を保存させ、適切なタイミングでその状態を簡単に復元することです。- #実際には、ブラウザのロールバック、データベースのバックアップと復元、オペレーティング システムのバックアップと復元、ドキュメントの取り消しとやり直し、チェスやカード ゲームの後悔など、メモ モードには多くの応用シナリオがあります。
- このモードは、発信元のカプセル化を維持できます。つまり、これらの状態は外部オブジェクトから隠す必要があるため、記録するためにメモ オブジェクトにのみ渡すことができます
- 状態のコピーの可能性発信者とメモの間でパフォーマンスの問題、特に大きなオブジェクトの複雑で多数の内部状態が発生するほか、一部の状態の欠落などのコーディングの抜け穴も発生します
- Mac のタイムマシン機能 コンピュータを特定時点の状態に復元できることは誰もが知っています。実はWindowsのゴーストにも同様の機能があります。当社のモバイルオペレーティングシステムもそのような機能を開発することを決定しました。 [Time Machine バックアップ] をクリックすると、携帯電話上のすべての情報、データ、およびステータス情報が圧縮されて保存されます。ユーザーが許可した場合、ユーザーの携帯電話のメモリを占有することを避けるために、圧縮されたパッケージがクラウド サーバーにアップロードされます。それ以外の場合は、圧縮パッケージがクラウド サーバーにアップロードされます。ユーザーの携帯電話のメモリにのみ保存できます。ユーザーの携帯電話を特定の時点に復元する必要がある場合、すべてのタイムマシンのバックアップがリストされ、ユーザーはワンクリックで携帯電話のシステム状態をその時点の状態に復元できます。すごく便利ですね! !
#完全なコード: https://github.com/zhangyue0503/designpatterns-php/blob/master/17.memento/source/memento.php
##例今回はテキスト メッセージを送信する例に戻ります。通常、テキスト メッセージや電子メールの送信などの機能を実行する場合、送信するコンテンツをデータベースまたはキャッシュから読み取って送信するキューが存在します。成功した場合は無視され、失敗した場合は、メッセージのステータスが表示されます。テキスト メッセージは失敗または再送信に変更されます。ここでは、直接前の未送信状態に戻し、次の送信キューが再度送信を行うのを待ちます。
SMS 送信クラス図
完全なソース コード: https://github.com/zhangyue0503/designpatterns- php /blob/master/17.memento/source/memento-message.php
<?php class Message { private $content; private $to; private $state; private $time; public function __construct($to, $content) { $this->to = $to; $this->content = $content; $this->state = '未发送'; $this->time = time(); } public function Show() { echo $this->to, '---', $this->content, '---', $this->time, '---', $this->state, PHP_EOL; } public function CreateSaveSate() { $ss = new SaveState(); $ss->SetState($this->state); return $ss; } public function SetSaveState($ss) { if ($this->state != $ss->GetState()) { $this->time = time(); } $this->state = $ss->GetState(); } public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class SaveState { private $state; public function SetState($state) { $this->state = $state; } public function GetState() { return $this->state; } } class StateContainer { private $ss; public function SetSaveState($ss) { $this->ss = $ss; } public function GetSaveState() { return $this->ss; } } // 模拟短信发送 $mList = []; $scList = []; for ($i = 0; $i < 10; $i++) { $m = new Message('手机号' . $i, '内容' . $i); echo '初始状态:'; $m->Show(); // 保存初始信息 $sc = new StateContainer(); $sc->SetSaveState($m->CreateSaveSate()); $scList[] = $sc; // 模拟短信发送,2发送成功,3发送失败 $pushState = mt_rand(2, 3); $m->SetState($pushState == 2 ? '发送成功' : '发送失败'); echo '发布后状态:'; $m->Show(); $mList[] = $m; } // 模拟另一个线程查找发送失败的并把它们还原到未发送状态 sleep(2); foreach ($mList as $k => $m) { if ($m->GetState() == '发送失败') { // 如果是发送失败的,还原状态 $m->SetSaveState($scList[$k]->GetSaveState()); } echo '查询发布失败后状态:'; $m->Show(); }
说明
- 短信类做为我们的原发器,在发送前就保存了当前的发送状态
- 随机模拟短信发送,只有两个状态,发送成功或者失败,并改变原发器的状态为成功或者失败
- 模拟另一个线程或者脚本对短信的发送状态进行检查,如果发现有失败的,就将它重新改回未发送的状态
- 这里我们只是保存了发送状态这一个字段,其他原发器的内部属性并没有保存
- 真实的场景下我们应该会有一个重试次数的限制,当超过这个次数后,状态改为彻底的发送失败,不再进行重试了
原文地址:https://juejin.cn/post/6844903983555805192
作者:硬核项目经理
推荐学习:《PHP视频教程》
以上がPHPのメモモードについて話しましょうの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

phpidentifiesauser'ssessionsingsinssessionCookiesIds.1)whensession_start()iscalled、phpgeneratesauniquesidstoredsored incoookienadphpsessidontheuser'sbrowser.2)thisidallowsphptortorieSessiondatadata fromthata

PHPセッションのセキュリティは、次の測定を通じて達成できます。1。session_regenerate_id()を使用して、ユーザーがログインまたは重要な操作である場合にセッションIDを再生します。 2. HTTPSプロトコルを介して送信セッションIDを暗号化します。 3。Session_Save_Path()を使用して、セッションデータを保存し、権限を正しく設定するためのSecure Directoryを指定します。

phpsessionFilesToredInthededirectoryspecifiedBysession.save_path、通常/tmponunix-likesystemsorc:\ windows \ temponwindows.tocustomizethis:1)uesession_save_path()tosetaCustomdirectory、ensuringit'swritadistradistradistradistradistra

toretrievedatafrompsession、Startthessession withsession_start()andAccessvariablesshe $ _SessionArray.forexample:1)Startthessession:session_start()

セッションを使用して効率的なショッピングカートシステムを構築する手順には、次のものがあります。1)セッションの定義と機能を理解します。セッションは、リクエスト全体でユーザーのステータスを維持するために使用されるサーバー側のストレージメカニズムです。 2)ショッピングカートに製品を追加するなど、基本的なセッション管理を実装します。 3)製品の量管理と削除をサポートし、高度な使用状況に拡大します。 4)セッションデータを持続し、安全なセッション識別子を使用することにより、パフォーマンスとセキュリティを最適化します。

この記事では、PHPでインターフェイスを作成、実装、および使用する方法について説明し、コード組織と保守性の利点に焦点を当てています。

この記事では、PHPのCrypt()とpassword_hash()の違いについて、パスワードハッシュの違いについて説明し、最新のWebアプリケーションの実装、セキュリティ、および適合性に焦点を当てています。

記事では、入力検証、出力エンコード、およびOWASP ESAPIやHTML浄化器などのツールを使用して、PHPのクロスサイトスクリプト(XSS)を防止します。


ホットAIツール

Undresser.AI Undress
リアルなヌード写真を作成する AI 搭載アプリ

AI Clothes Remover
写真から衣服を削除するオンライン AI ツール。

Undress AI Tool
脱衣画像を無料で

Clothoff.io
AI衣類リムーバー

Video Face Swap
完全無料の AI 顔交換ツールを使用して、あらゆるビデオの顔を簡単に交換できます。

人気の記事

ホットツール

VSCode Windows 64 ビットのダウンロード
Microsoft によって発売された無料で強力な IDE エディター

SecLists
SecLists は、セキュリティ テスターの究極の相棒です。これは、セキュリティ評価中に頻繁に使用されるさまざまな種類のリストを 1 か所にまとめたものです。 SecLists は、セキュリティ テスターが必要とする可能性のあるすべてのリストを便利に提供することで、セキュリティ テストをより効率的かつ生産的にするのに役立ちます。リストの種類には、ユーザー名、パスワード、URL、ファジング ペイロード、機密データ パターン、Web シェルなどが含まれます。テスターはこのリポジトリを新しいテスト マシンにプルするだけで、必要なあらゆる種類のリストにアクセスできるようになります。

DVWA
Damn Vulnerable Web App (DVWA) は、非常に脆弱な PHP/MySQL Web アプリケーションです。その主な目的は、セキュリティ専門家が法的環境でスキルとツールをテストするのに役立ち、Web 開発者が Web アプリケーションを保護するプロセスをより深く理解できるようにし、教師/生徒が教室環境で Web アプリケーションを教え/学習できるようにすることです。安全。 DVWA の目標は、シンプルでわかりやすいインターフェイスを通じて、さまざまな難易度で最も一般的な Web 脆弱性のいくつかを実践することです。このソフトウェアは、

SublimeText3 中国語版
中国語版、とても使いやすい

Safe Exam Browser
Safe Exam Browser は、オンライン試験を安全に受験するための安全なブラウザ環境です。このソフトウェアは、あらゆるコンピュータを安全なワークステーションに変えます。あらゆるユーティリティへのアクセスを制御し、学生が無許可のリソースを使用するのを防ぎます。

ホットトピック









