検索
ホームページバックエンド開発PHPチュートリアルPHP_PHP チュートリアルの 12 のデザイン パターン

PHP 12 のデザインパターン

PSR-0仕様の設計ベース
1. すべてに名前空間を使用します
2. すべての PHP ファイルは include/require なしで自動的にロードされる必要があります
spl_autoload_register
3.シングル入場モード




1. 基本デザイン3パターン
ファクトリーモード
工場出荷時の方法で新しいものと交換してください


クラスファクトリー{

静的関数 createDatabase(){
$db = 新しいデータベース;
$db を返します;
}
}
使用する場合は、 $db = Factory::createDatabase(); を使用できます




シングルトンパターン
クラスデータベース{
プライベート $db;


プライベート関数 __construct(){
//ここにデータベースに接続するための書き込みができます
}


静的関数 getInstance(){
if(self::$db){
自分自身を返す::$db;
}その他{
self::$db=新しいself()
return self::$db;//private は単独で呼び出すことができます
}
}


関数 where(){




}


}


ファクトリープラスシングルトンモードの場合
クラスファクトリー{

静的関数 createDatabase(){
$db = データベース::getInstance();
$db を返します;
}
}


レジストラ (ツリー) モード
クラス登録{
保護された静的 $object;
静的関数セット($alias,$object){
self::$object[$alias]=$object;


}
静的関数 get($name)
{
return self::$object[$name];
}
function _unset($alias){
unset(self::$object[$alias]);
}
}
ファクトリーメソッドとの組み合わせ
クラスファクトリー{

静的関数 createDatabase(){
$db = データベース::getInstance();
登録::set('db1',$db);
$db を返します;
}
}
呼び出しを直接インデックス化します
$db = 登録::get('db1');


アダプターモード
1. アダプターモードは、完全に異なる機能インターフェイスを統合 API にカプセル化できます
2. 実践的なアプリケーション例として、PHP データベース操作には、mysql、mysqli、pdo が含まれます。アダプター モードを使用できます
。 一貫性への統合。同様のシナリオには、memcache、redis、file、apc などのさまざまなキャッシュ機能を一貫性へ統合するキャッシュ アダプターが含まれます。 たとえば、Database.php にはインターフェースがあります
インターフェースIDatabase
{
関数 connect($host,$user,$pwd,$dbname);
関数クエリ($sql);
関数 close();
}


以下の3つのカテゴリがあります
クラス mysql は IDatabase{
を実装します プライベート $con;
関数 connect($host,$user,$pwd,$dbname){
$this->con = mysql_connect($host,$user,$pwd);
mysql_select_db($dbname,$this->con);
}
関数クエリ($sql){
return mysql_query($sql,$this->con);
}
関数 close(){
return mysql_close($this->con);
}
}


クラス mysqli は IDatabase{
を実装します 保護された $con;
関数 connect($host,$user,$pwd,$dbname)
{
$this->con = mysqli_connect($host,$user,$pwd,$dbname);
}
関数クエリ($sql)
{
return mysqli_query($this->con,$sql);
}
関数close()
{
return mysqli_close($this->con);
}
}


クラス PDO は IDatabase{
を実装します 保護された $con;
関数 connect($host,$user,$pwd.$dbname)
{
$con = 新しい PDO("mysql:host=$host;dbname=$dbname",$user,$pwd);
$this->con=$con;
}
関数クエリ($sql){
return $this->con->query($sql);
}
関数 close(){
unset($this->con);
}
}
それで、私たちが電話するとき
$db = 新しい mysql() または新しい PDO();
$db->connect('127.0.0.1','root','root');
$db->query();
$db->close();


戦略モード
特定の動作とアルゴリズムのセットをクラスにカプセル化し、特定の特定のコンテキストに適応させるこのパターンが戦略パターンです
。 電子商取引システムのウェブサイトシステムで、男性ユーザーと女性ユーザーがそれぞれ異なる商品カテゴリにジャンプする必要がある場合の実用的な適用距離
まず戦略インターフェースファイルを宣言します
インターフェイス UserStrategy{
関数 showAd();
関数 showcategory();
}


//最初の戦略は女性ユーザー向けです
クラス女性UserStrategyはUserStrategyを実装します{
関数 showAd(){
echo '2014 新作婦人服';
}
関数 showCategory()
{
「婦人服」をエコー;
}
}
// 2 番目の戦略は男性ユーザー向けです
クラス MaleUserStrategy は UserStrategy{
を実装します 関数 showAd(){
echo '2014 新しい紳士服';
}
関数 showCategory()
{
「紳士服」をエコーし​​ます;
}
}
//ページクラスがある場合
クラスページ{
保護された $strategy;
関数インデックス(){
$this->strategy->showAd();
$this->strategy->showCategory();
}


function setStrategy(UserStrategt $strategy){
$this->strategy=$strategy;
}
}
$page = 新しいページ();
if(isset($_GET['女性'])){
$strategy = new FemaleUserStrategy();
}その他{
$strategy = new MaleUserStrategy();
}
$page->setStrategy($strategy);
$page->index();
ハードコーディングされたモデルから分離されたモデルへ


データオブジェクトマッピングパターン
データ オブジェクト マッピング モードは、オブジェクトとデータ ストレージを
にマップします。 オブジェクトの操作は、データ ストア上の操作にマップされます。
コードでデータ オブジェクト マッピング モードを実装するには、複雑な SQL ステートメントをオブジェクト属性操作にマップする ORM クラスを実装します
クラス ユーザー{
パブリック $id;
パブリック $name;
パブリック $mobile;
パブリック $regtime;
保護された $db;
関数 __construct($id){
// まずデータを取得します
$this->db = 新しい mysql();
$this->db->connect('xxxxx'xxxx);
$res = $this->db->query('select * from XXX where id = {$id}');
$data = $res->fetch_assoc();


$this->id=$data['id'];
$this->name=$data['name'];
$this->mobile=$data['mobile'];
$this->regtime=$data['regtime'];
$res を返します;
}


関数 __destruct(){
//修正として使用できます
$this->db->query('update xx set name={$this->name} mobile={$this->mobile}XXXXX where id = {$this->id}');
}
}


$user = new User(1);//1 はデータベース内の ID が 1 つであることに対応します
$user->mobile = '155555555';
$user->name='テスト';
$user->regtime=time();
// ここには SQL ステートメントはありません。オブジェクトに対する操作のみです


包括的なアプリケーション (ファクトリーモード、レジストラーモード、アダプターモード)



と オブザーバーモード
1. オブザーバー パターン。オブジェクトの状態が変化すると、それに依存するすべてのオブジェクトが通知を受け取り、自動的に更新されます。
2. シナリオ: イベントが発生した後、一連の更新操作を実行する必要があります。従来のプログラミング方法は
です。 イベントコードの直後に処理ロジックを追加するため、更新ロジックが増えるとコードの保守が難しくなります
。 新しいロジックを追加するには、イベント本体のコードを変更する必要があります
3. オブザーバー パターンは、低結合で非侵入的な通知更新メカニズムを実装します。
デモ
クラスイベント{
関数トリガー(){
echo "Event";// イベントが発生したことを示します


//更新ロジックの作成を開始します
エコー「論理 1」;

エコー 'ロジック 2';


エコー「ロジック 3」;


}
}


$event = new Event();//従来の方法は結合されており煩雑です
//ソースコードを変更する必要があるため、オブザーバーパターンを定義します
デモ
//インターフェイスが登場します
//最初に基本抽象クラスが来ます
抽象クラス EventGenerator{
プライベート $observers = array();
関数 addObserver(Observer$observer){
$this->oververs[]=$oberver;
}
関数notify(){
foreach($this->oververs as $observer)
{
$observer->updata();
}
}
}
インターフェースオーバーバー{
関数更新($event_info = null);
}
//したがって、現時点では、この基本クラスを継承する Event クラスが必要です
class Event extends EventGenerator{
関数トリガー(){
echo "Event";// イベントが発生したことを示します
$this->notify();
}
}


クラス Observer1 は Observer{
を実装します 関数更新($event_info=null)
{
エコー「ロジック 1」;
}
}


class Oberver2 は Oberver を実装します{
関数更新($event_info=null)
{
エコー「ロジック 2」;
}
}




プロトタイプモード
1. ファクトリーモードと同様に、オブジェクトの作成に使用されます
2. プロトタイプモードはファクトリーモードの実装と異なり、まずプロトタイプを作成します
オブジェクトを作成し、プロトタイプ オブジェクトをクローンして新しいオブジェクトを作成すると、クラスが不要になります
作成中に初期化操作が繰り返される
3. プロトタイプモードは、大きなオブジェクトの作成に適しています。大きなオブジェクトを作成するたびに、大量のコストがかかります。 プロトタイプ モードではメモリのみがコピーされます。
Canvas クラスがあるとします。新しいのは複雑です
あと2回くらい使いたい
このようにして、プロトタイプ モードを使用して new の問題を解決し、クローンを使用して new を置き換えることができます
初期化後に直接クローンを作成するだけです。


デコレータパターン
1. デコレータ モードでは、クラス関数を動的に追加および変更できます。
2. クラスは関数を提供します。追加の関数を変更したい場合は、従来の
を使用します。 プログラミング モードでは、サブクラスを作成して継承し、クラス メソッドを再実装する必要があります。
3. デコレータ モードを使用すると、実行時にデコレータ オブジェクトを追加するだけで最大限の柔軟性を実現できます
Canvas クラスがある場合。色を追加したい場合、印刷できる正方形は 1 つだけです
通常、サブクラスを作成し、そのキャンバス クラスを継承します。
キャンバスを生成するメソッドをオーバーライドします。では、たくさんの機能を追加したい場合はどうすればよいでしょうか?
多くのクラスを書き直す必要がありますか?
次に、デコレータ パターンを使用してこの問題を解決します
まず、キャンバス デコレータ インターフェイスを宣言しましょう
インターフェイス DrawDecorator{
関数 beforeDraw();
関数 afterDraw();
}


たとえば、キャンバスクラスのdraw()メソッドを変更する必要があります
そこで、draw() メソッドで
を呼び出します。 関数描画(){
$this->beforeDraw();
//元のコードの内容はこちら
$this->afterDraw();
}
次に、protected $decorators[]=array();
をキャンバス クラスに追加します。 デコレーターインターフェイスを受け取るメソッドを追加します
関数 addDecorator(DrawDecorator $decorator){
$this->decorators[]=$decorator;
}
デコレーターを呼び出すメソッドをさらに 2 つ追加します
関数 beforeDraw(){
foreach($this->decorators as $decorator)
{
$decorator->beforeDraw();
}
}


関数 afterDraw(){
//逆、後入れ先出し
$decorators = array_reverse($this->decorators);
foreach($decorators として $decorator)
{
$decorator->afterDraw();
}
}


カラーデコレーターがいます
クラス ColorDrawDecorator は DrawDecorator を実装します{
保護された $color;
関数 __construct($color='red')
{
$this->color= $color;
}
beforeDraw() 関数
{
echo "
";
}
関数 afterDraw()
{
エコー「
」「
}
}
ここで実装するために継承する必要はありません
$a = new Canvas();//キャンバスクラスをインスタンス化します
$a -> init();//初期化
$a -> addDecorator(new colorDrawDecorator('green'));//カラーデコレータクラスを追加します
イテレーターパターン
1. イテレーターモード、内部実装を知らずに yige を走査します
集合オブジェクトの内部要素
2. 従来のプログラミングモデルと比較して、反復子パターンは要素を走査するために必要な操作を隠すことができます
たとえば、データベースを走査してすべてのオブジェクトを取得します
クラス Alluser はイテレーターを実装します{
保護された $id;
protected $index;//イテレータの現在位置
protected $data=array();
//Iterator はイテレータインターフェイスです
関数 __construct(){
$db = Factory::getDatabase();
$result = $db->query("ユーザーからの選択 ID");
$this->ids = $db->mysql_fetch_assoc($result);
}
関数 current(){
// 現在の要素を取得します
$id=$this->ids[$this->index]['id'];
return Factory::getUser($id);
}
関数 next(){
//次の要素
$this->index ++;
}
関数有効()
{
//データがあるかどうかを判定します
return $this->index ids);
}
関数 rewind(){
$this->index=0;//始まりへの第一歩
}
ファンクションキー(){
// 現在のインデックスを取得します
$this->index を返す;
}
}
$users = new Alluser();
foreach ($users として $user)
{
var_dump($user);
}
エージェントモード
1. クライアントとエンティティの間にプロキシ オブジェクト (プロキシ) を確立し、クライアントはエンティティに対するすべての操作をプロキシ オブジェクトに委任し、エンティティの特定の実装の詳細を隠します。
一つだけ書いてください


オブジェクト指向プログラミングの基本原則
1. 単一の責任: クラスは 1 つのことだけを行う必要があります
2. オープンとクローズ: クラスは拡張可能である必要がありますが、変更はできません
3. 依存関係の逆転: あるクラスが別のクラスに強く依存するべきではありません。各クラスは別のクラスに置き換え可能です
。 4. 構成: ハードコーディングの代わりに、可能な限り構成を使用します。
5. インターフェイス指向プログラミング: 実装ではなく、インターフェイスのみを考慮する必要があります。


MVC アーキテクチャの原則
まず新しい Config オブジェクトを作成しましょう
$config = 新しい構成(__DIR__.'/configs');
$config['コントローラー'];


次に、Config クラスがあります
クラス Config は ArrayAccess{
を実装します //ArrayAccess インターフェースは組み込みインターフェースです。つまり、配列値の受け渡しが許可されており、実装するメソッドは 4 つあります
保護された $path;
protected $configs=array();
関数 __construct($path)
{
$this->path=$path;
}
関数 offsetGet($key){
//設定配列ファイル名のキーを取得します
if(empty($this->configs[$key]))
//配列ファイル名が元の設定ファイルに存在しない場合は、それをロードします
{
$file_path=$this->path.'/'.$key.'.php';//読み込みパスを生成します
$config = $file_path が必要;
$this->config[$key]=$config;
}
return $this->configs[$key];


}
関数 offsetSet($key,$value)
{
//配列のキーを設定します
}
関数 offsetExists($key)
{ //配列のキーが存在するか確認します
return isset($this->configs[$key]);
}
関数 offsetUnset($key)
{ //配列のキーを削除します

}
}


controller.phpなどの設定ファイル
$config = 配列(
'ホーム'=>配列(
'デコレータ'=>配列(
'IMoocDectoratorTemplate'、
)、
)、
);


構成とデザインパターン
1. PHP で ArrayAccess を使用して構成ファイルをロードします
2. ファクトリメソッドで設定を読み取り、設定可能なオブジェクトを生成します
3. デコレーター モードを使用して、権限の検証、テンプレートのレンダリング、JSON のシリアル化を実装します
4. オブザーバー パターンを使用して、データ更新イベントの一連の更新操作を実装します
5. プロキシモードを使用してデータベースの自動マスター/スレーブ切り替えを実現します

www.bkjia.comtru​​ehttp://www.bkjia.com/PHPjc/1011354.html技術記事 PHP 12 の設計パターン PSR-0 仕様の設計基盤 1. すべて名前空間を使用する 2. すべての PHP ファイルは自動的にロードされる必要があり、spl_autoload_register を含めたり要求したりすることはできません 3. シングル エントリ モード...
声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
如何在PHP后端功能开发中合理应用设计模式?如何在PHP后端功能开发中合理应用设计模式?Aug 07, 2023 am 10:34 AM

如何在PHP后端功能开发中合理应用设计模式?设计模式是一种经过实践证明的解决特定问题的方案模板,可以用于构建可复用的代码,在开发过程中提高可维护性和可扩展性。在PHP后端功能开发中,合理应用设计模式可以帮助我们更好地组织和管理代码,提高代码质量和开发效率。本文将介绍常用的设计模式,并给出相应的PHP代码示例。单例模式(Singleton)单例模式适用于需要保

如何通过编写代码来学习和运用 PHP8 的设计模式如何通过编写代码来学习和运用 PHP8 的设计模式Sep 12, 2023 pm 02:42 PM

如何通过编写代码来学习和运用PHP8的设计模式设计模式是软件开发中常用的解决问题的方法论,它可以提高代码的可扩展性、可维护性和重用性。而PHP8作为最新版的PHP语言,也引入了许多新特性和改进,提供更多的工具和功能来支持设计模式的实现。本文将介绍一些常见的设计模式,并通过编写代码来演示在PHP8中如何运用这些设计模式。让我们开始吧!一、单例模式(Sing

深入聊聊设计模式利器之“职责链模式”(附go实现流程)深入聊聊设计模式利器之“职责链模式”(附go实现流程)Jan 17, 2023 am 11:43 AM

本篇文章给大家带来了关于golang设计模式的相关知识,其中主要介绍了职责链模式是什么及其作用价值,还有职责链Go代码的具体实现方法,下面一起来看一下,希望对需要的朋友有所帮助。

Go语言中的ETL的设计模式Go语言中的ETL的设计模式Jun 01, 2023 pm 09:01 PM

随着数据的增长和复杂性的不断提升,ETL(Extract、Transform、Load)已成为数据处理中的重要环节。而Go语言作为一门高效、轻量的编程语言,越来越受到人们的热捧。本文将介绍Go语言中常用的ETL设计模式,以帮助读者更好地进行数据处理。一、Extractor设计模式Extractor是指从源数据中提取数据的组件,常见的有文件读取、数据库读取、A

深入解析Go语言中的单例模式深入解析Go语言中的单例模式Mar 21, 2023 pm 06:36 PM

单例模式是一种常见的设计模式,它在系统中仅允许创建一个实例来控制对某些资源的访问。在 Go 语言中,实现单例模式有多种方式,本篇文章将带你深入掌握 Go 语言中的单例模式实现。

设计模式的六大原则是什么设计模式的六大原则是什么Jan 06, 2023 pm 04:25 PM

设计模式的六大原则:1、单一职责原则,其核心就是控制类的粒度大小、将对象解耦、提高其内聚性;2、开闭原则,可以通过“抽象约束、封装变化”来实现;3、里氏替换原则,主要阐述了有关继承的一些原则;4、依赖倒置原则,降低了客户与实现模块之间的耦合;5、接口隔离原则,是为了约束接口、降低类对接口的依赖性;6、迪米特法则,要求限制软件实体之间通信的宽度和深度。

了解JavaScript中的设计模式和最佳实践了解JavaScript中的设计模式和最佳实践Nov 03, 2023 am 08:58 AM

随着JavaScript的不断发展和应用范围的扩大,越来越多的开发人员开始意识到设计模式和最佳实践的重要性。设计模式是一种被证明在某些情况下有用的软件设计解决方案。而最佳实践则是指在编程过程中,我们可以应用的一些最佳的规范和方法。在本文中,我们将探讨JavaScript中的设计模式和最佳实践,并提供一些具体的代码示例。让我们开始吧!一、JavaScript中

C#开发建议:设计模式与架构选择C#开发建议:设计模式与架构选择Nov 22, 2023 pm 03:53 PM

在C#开发中,设计模式和架构选择是至关重要的。良好的设计模式和合适的架构选择可以大大提高软件的可维护性、扩展性和性能。本文将讨论一些在C#开发中常用的设计模式和架构选择,并给出一些建议。设计模式是解决特定问题的通用解决方案,它们可以帮助开发人员避免重复造轮子,提高代码的可重用性和可读性。在C#开发中,有许多常用的设计模式,如单例模式、工厂模式、观察者模式等。

See all articles

ホットAIツール

Undresser.AI Undress

Undresser.AI Undress

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

AI Clothes Remover

AI Clothes Remover

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

Undress AI Tool

Undress AI Tool

脱衣画像を無料で

Clothoff.io

Clothoff.io

AI衣類リムーバー

AI Hentai Generator

AI Hentai Generator

AIヘンタイを無料で生成します。

ホットツール

SAP NetWeaver Server Adapter for Eclipse

SAP NetWeaver Server Adapter for Eclipse

Eclipse を SAP NetWeaver アプリケーション サーバーと統合します。

EditPlus 中国語クラック版

EditPlus 中国語クラック版

サイズが小さく、構文の強調表示、コード プロンプト機能はサポートされていません

Dreamweaver Mac版

Dreamweaver Mac版

ビジュアル Web 開発ツール

メモ帳++7.3.1

メモ帳++7.3.1

使いやすく無料のコードエディター

VSCode Windows 64 ビットのダウンロード

VSCode Windows 64 ビットのダウンロード

Microsoft によって発売された無料で強力な IDE エディター