PHP 12 のデザイン パターン

WBOY
WBOYオリジナル
2016-06-23 13:33:40935ブラウズ

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




1. 3 つの基本的な設計パターン
ファクトリーパターン
新しい

クラスを置き換えるには、ファクトリ メソッドを使用します。 Factory{

static function createDatabase(){
$db = new Database
return $db;
}
}
$ DB = Factory :: を使用できます。 Createdatabase (); ブリーク
static function getInstance(){
if(self::$db){
return self::$db;
}else{
self::$db=new self()
return self:: $db;// private は自分自身を呼び出すことができます
}
}


function where(){




}


}


ファクトリとシングルトンモードの場合
class Factory{

静的関数createDatabase(){
$ db = Database::getInstance();
return $db; }
}

登録 (ツリー) モード
class Register{
protected static $object; ($エイリアス, $object){
self::$object[$alias]=$object


}
静的関数 get($name)
; $object unset(self::$object[$alias]);
ファクトリメソッドと組み合わせる
class Factory{

static function createDatabase(){
$db = Database::getInstance()
Register::set ('db1',$db);

}

インデックスは直接呼び出されます
$db = Register::get('db1');


アダプター モード
1. アダプター モードは完全に異なる機能インターフェイスが統合された API にカプセル化されます
2. 実用的なアプリケーションの例PHP データベース操作には、アダプター モード
を使用して 1 つに統合できる mysql、mysqli、pdo が含まれます。同様のシナリオには、memcache、redis、file や apc などのさまざまなキャッシュ機能を 1 つに統合するキャッシュ アダプターが含まれます。たとえば、Database.php にはインターフェースがあります。
以下の 3 つのクラスがあります
class mysqlimplements IDatabase{
private $con;
function connect($host,$user,$pwd,$dbname){
$this->con = mysql_connect($host,$user, $pwd);
mysql_select_db($dbname,$this->con);
関数 query($sql){
return mysql_query($sql, $this->con);
関数 close() {
return mysql_close($this->con);
}
}


クラス mysqli は IDatabase{
protected $con を実装します。
function connect($ host,$user,$pwd,$dbname)
{
$ this->con = mysqli_connect($host,$user,$pwd,$dbname);
}
function query($sql)
{
return mysqli_query ($this->con,$sql)
}
function close()
{
return mysqli_close($this->con);
}
}


クラス PDO は IDatabase{
protected $con を実装します
function connect($host,$user,$pwd.$dbname; )
{
$con = new PDO("mysql:host=$host;dbname=$dbname",$user,$pwd);
$this->con=$con;
関数クエリ($sql) ){
return $this->con->query($sql);
}
function close(){
unset($this-> con); を呼び出すと、
$db = new mysql(); または new PDO();
$db->connect('127.0.0.1','root ','root');クエリ();
$db->close();

戦略モード
特定の動作とアルゴリズムのセットを特定のコンテキストに適応するクラスにカプセル化する、このパターンが戦略パターンです
実際のアプリケーションの距離、電子商取引システムの Web サイト システムの場合、男性と女性のユーザーは異なる製品カテゴリにジャンプする必要があります
最初に戦略インターフェイス ファイルを宣言します
Interface UserStrategy{
function showAd();
function showcategory(); }


//最初の戦略は女性ユーザー向けです
class FemaleUserStrategyimplements UserStrategy{
function showAd(){
echo '2014 年の新しい婦人服';
function showCategory()
{
echo '婦人服'; }
}
//2 番目の戦略、男性ユーザー向け
class MaleUserStrategyimplements UserStrategy{
function showAd(){
echo '2014 新作紳士服';
function showCategory()
{
echo '紳士服';
class page{
protected $strategy; (){
through through out through out off out through outce out Through out Through out Through Over Over ‐ ‐ ‐ そのままにしておいて、this- >strategy=$strategy;
}
}
$page = new Page( );
if(isset($_GET['女性'])){
$strategy = new FemaleUserStrategy();
}else{
$ Strategy = new MaleUserStrategy() }
$page->setStrategy($) Strategy);
$page->index();
ハードコーディングされたパターンから分離されたパターンへ

データ オブジェクト マッピング パターン
データ オブジェクト マッピング モードは、オブジェクトとデータ ストレージをマップします。データストレージについて。
コードでデータ オブジェクト マッピング モードを実装するには、複雑な SQL ステートメントをオブジェクト属性操作にマップするための ORM クラスを実装します。
protected $db;
function __construct($id){
// まずデータを取得します
$this->db = new mysql();
$this->db->connect('xxxxx'xxxx) ;
$res = $this->db->query('select * from XXX where id = {$id}'); $data = $res->fetch_assoc(); 'id'];
$this->name=$data['name'];
$this->mobile=$data['regtime] '];
return $res; }


function __destruct(){
using using ‐ ‐ ‐ regtime=$data['regtime'] {$this->name} mobile={$this- >mobile}XXXXX where id = {$this->id}');
}
}


$user = new User(1);/ /1 は 1 つのデータベース内の ID に対応します
$user ->mobile = '155555555';
$user->name='test';
$user->regtime=time();
// ここには SQL ステートメントはありません


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


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

// 更新ロジックの作成を開始します












echo 'ロジック 3' ;


}
}


$event = new Event();//従来の方法は結合されており煩雑です
//ソースコードを変更する必要があるため、Observer パターンを定義します
デモ
//ここでインターフェースが来ます
//最初に基本抽象クラスが来ます
抽象クラス EventGenerator{
private $observers = array();
function addObserver(Observer$observer){
$this-> ;obervers[]=$oberver; }
関数notify(){
foreach($this->obervers as $observer)
{
    $observer->updata();
}
}
}
interface Oberver{
function update($event_info = null);
}
//所以说这个时候我们需要Event类继承这个基类
class Event extends EventGenerator{
function trigger(){
echo "Event";//表示事件发生了
    $this->notify();
}
}


class Observer1 implements Observer{
function updata($event_info=null)
{
 echo "逻辑一";
}
}


class Oberver2 implements Oberver{
function updata($event_info=null)
{
 echo "逻辑二";
}
}




原型模式
1.与工厂模式作用类似,都是用来创建对象
2.与工厂模式的实现不同,原型模式先创建好一个原型
对象,然后通过clone原型对象来创建新的对象,这样就免去了类
创建时重复的初始化操作
3.原型模式适合于大对象的创建,创建一个大对象需要很大的开销,如果每次new就会消耗很大,
原型模式仅仅拷贝内存即可。
假如有一个画布类。new很复杂
我又想使用他两次
这样我们就可以用原型模式解决new的问题,用clone替代new
初始化之后直接clone即可。


装饰器模式
1.装饰器模式,可以动态的添加修改类的功能。
2.一个类提供了一项功能,如果要在修改并添加额外的功能,传统的
编程模式,需要写一个子类继承他,并重新实现类的方法。
3.使用装饰器模式,仅需在运行时添加一个装饰器对象即可实现,可以实现最大的灵活性
如果我们有一个画布类。只能打印一个正方形,假如我们想要添加一个颜色
一般是写一个子类,继承那个画布类。
重写产生画布的方法。那我们如果要增加很多功能呢?
是不是要重写很多类?
下面我们用装饰器模式解决这个问题
首先我们先声明一个画布的装饰器的接口
interface DrawDecorator{
function beforeDraw();
function afterDraw();
}


比如我们要修改画布类的draw()方法
所以我们在draw()方法中调用
function draw(){
$this->beforeDraw();
//这里是原来代码的内容
$this->afterDraw();
}
再在画布类中添加一个protected $decorators[]=array();
在添加一个方法,用来接收装饰器接口
function addDecorator(DrawDecorator $decorator){
$this->decorators[]=$decorator;
}
再添加两个调用装饰器的方法
function beforeDraw(){
foreach($this->decorators as $decorator)
{
 $decorator->beforeDraw();
}
}


function afterDraw(){
//进行反转,后进先出
    $decorators = array_reverse($this->decorators);
foreach($decorators as $decorator)
{
 $decorator->afterDraw();
}
}


我们有一个颜色装饰器
class ColorDrawDecorator implements DrawDecorator{
protected $color;
function __construct($color='red')
{
$this->color= $color;
}
function beforDraw()
{
 echo "

";
}
function afterDraw()
{
  echo "
"
}
}
ここで実装するために継承する必要はありません
$a = new Canvas();//キャンバスクラスをインスタンス化します
$a -> init();//初期化します
$a -> ; addDecorator(new colorDrawDecorator('green'));//カラー デコレータ クラスを追加します
イテレータ モード
1. イテレータ モードは、内部実装を知らずに yige
集合オブジェクトの内部要素を走査します
2. 従来のプログラミングとの比較モードでは、反復子モードは要素を走査するために必要な操作を非表示にすることができます
たとえば、データベースを走査してすべてのオブジェクトを取得します
class Alluserimplements Iterator{
protected $ids;
protected $index;// イテレータの現在位置
protected $data=array();
//Iterator はイテレータ インターフェイスです
function __construct(){
$db = Factory::getDatabase();
$result = $db->query(" selecy id from user") ;
$this->ids = $db->mysql_fetch_assoc($result); }
function current(){
//現在の要素を取得
$id=$this->ids [$this-> ;index]['id'];
return Factory::getUser($id);
function next(){
//次の要素
$this->index ++ }
function valid()
{
//データがあるかどうかを判断します
return $this->index < count($this->ids) }
function rewind(){
$this->index =0;//始まりへの第一歩
}
function key(){
//現在のインデックスを取得します
return $this->index
}
}
$users = new Alluser() foreach ($ users as $ user)
{
var_dump($user);
}
プロキシ モード
1. クライアントとエンティティの間にプロキシ オブジェクト (プロキシ) を確立します。エンティティに対してクライアントによって実行されるすべての操作は、非表示のプロキシ オブジェクトに委任されます。エンティティ固有の実装の詳細。
書くだけです


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


MVC アーキテクチャの原則
まず新しい Config オブジェクトを作成しましょう
$config = new Config(__DIR__.'/configs');
$config['controller']; 次に、Config クラス
class Config を作成します。 implements ArrayAccess{
//ArrayAccess インターフェースは組み込みインターフェースです。つまり、実装されるメソッドは 4 つあります。
protected $path;
protected $configs=array();
function __construct($path)
{
$ this->path=$path; }
function offsetGet($key){
// 構成配列ファイル名のキーを取得します
配列ファイル名が存在しない場合元の設定ファイルをロードします
$file_path; $this->config[$key]=$config; )
// 配列のキーを設定します
関数 offsetExists($key)
{ //配列のキーが存在するかどうかを確認します
return isset($this->configs[$key])
}
function offsetUnset($key)
{ //配列のキーを削除します

}
}


controller.phpなどの設定ファイル
$config = array(
'home'=>array(
'decorator'=>array
of Object
3. デコレータパターンを使用する権限の検証、テンプレートのレンダリング、JSON のシリアル化を実装します
4. オブザーバー パターンを使用して、データ更新イベントの一連の更新操作を実装します
5. プロキシモードを使用してデータベースの自動マスター/スレーブ切り替えを実装します

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。