ホームページ  >  記事  >  バックエンド開発  >  PHPデザインパターンの基礎知識と応用

PHPデザインパターンの基礎知識と応用

墨辰丷
墨辰丷オリジナル
2018-06-07 13:57:581156ブラウズ

この記事では、PHP デザインパターンの基礎知識と応用を中心に紹介しますので、興味のある方は参考にしていただければ幸いです。

php 登録ツリー モード

登録ツリー モードとは何ですか?

登録ツリー モードは、当然、登録モードやレジストラ モードとも呼ばれます。ここであえて名前を付けたのは、名前登録ツリーの方が分かりやすいと思うからです。前の 2 つの記事と同様に、この記事も名前から始まります。登録ツリー パターンは、オブジェクト インスタンスをグローバル オブジェクト ツリーに登録し、必要に応じてオブジェクト ツリーから選択するパターン設計方法です。これを聞くと、私が子供の頃に砂糖漬けのサンザを棒に付けて買ったのを思い出します。砂糖漬けのサンザの売り手は砂糖漬けのサンザを大きな棒に刺し、人々はそれを買うときにそれを外していました。違いは、登録ツリー モードでは、摘んだ後も残り、何度でも摘み取ることができますが、サンザシの砂糖漬けは一度摘むと消えてしまうことです。 。 。

登録ツリー モードを使用する必要があるのはなぜですか?

シングルトン モードはプロジェクト全体で一意のオブジェクト インスタンスを作成する方法の問題を解決し、ファクトリ モードは new を使用せずにインスタンス オブジェクトを作成する方法の問題を解決します。それでは、登録ツリー モードはどのような問題を解決したいのでしょうか?この問題を検討する前に、最初の 2 つのモデルが現在直面している制限を考慮する必要があります。まず、シングルトンモードで独自のオブジェクトを作成するプロセス自体にも、オブジェクトが存在するかどうかという判断があります。存在する場合はオブジェクトが返され、存在しない場合はオブジェクトが作成されて返されます。インスタンス オブジェクトが作成されるたびに、このような判断層が必要になります。ファクトリーモデルでは、延長メンテナンスの問題がより考慮されています。一般に、シングルトン パターンとファクトリ パターンは、より合理的なオブジェクトを生成できます。これらのオブジェクトを簡単に呼び出すにはどうすればよいでしょうか?さらに、このようにしてプロジェクト内で作成されたオブジェクトは、散在する兵士のようなものであり、全体の管理や配置には不便です。そこで、登録ツリー モデルが登場しました。シングルトン モード、ファクトリ モード、またはその 2 つの組み合わせのいずれでオブジェクトを生成したかに関係なく、オブジェクトはすべて登録ツリーに「挿入」されます。オブジェクトを使用するときは、登録ツリーから直接オブジェクトをフェッチするだけです。これは、グローバル変数を使用するのと同じくらい便利で実用的です。また、登録ツリー パターンは、他のパターンにも非常に良いアイデアを提供します。

登録ツリーを実装するにはどうすればよいですか?

上記の説明により、解決策は簡単に見つかったようです。もちろん、最初に登録ツリーとしてクラスが必要です。すべてのオブジェクトが登録ツリーに「挿入」されます。この登録ツリーは静的変数によって提供される必要があります。そして、この登録ツリーは 2 次元配列である必要があります。このクラスにはオブジェクト インスタンスを挿入するメソッド (set()) が必要であり、それに対応してオブジェクト インスタンスを元に戻すメソッド (_unset()) も必要です。もちろん、最も重要なことは、オブジェクトを読み取るメソッド (get()) を用意することです。これらを使用すると、登録ツリー モードを無事に完了できます~~~

次に、3 つのモードを少し組み合わせてみましょう。インスタンス オブジェクトを作成するだけならそれほど複雑ではありませんが、大規模なプロジェクトに適用すると、その利便性は自明です。

<?php
//创建单例
class Single{
 public $hash;
 static protected $ins=null;
 final protected function __construct(){
  $this->hash=rand(1,9999);
 }
 static public function getInstance(){
  if (self::$ins instanceof self) {
   return self::$ins;
  }
  self::$ins=new self();
  return self::$ins;
 } 
}
//工厂模式
class RandFactory{
 public static function factory(){
  return Single::getInstance();
 }
}
//注册树
class Register{
 protected static $objects;
 public static function set($alias,$object){
  self::$objects[$alias]=$object;
 }
 public static function get($alias){
  return self::$objects[$alias];
 }
 public static function _unset($alias){
  unset(self::$objects[$alias]);
 }
}
Register::set(&#39;rand&#39;,RandFactory::factory());
$object=Register::get(&#39;rand&#39;);
print_r($object);

この時点で、3 つのデザイン モードの導入が完了しました。さまざまなパターン デザイン自体が相互に補完し合い、将来他のパターンを導入する際には、多かれ少なかれ 1 つまたは複数の他のデザイン パターンが使用されることになります。

たとえモデルが理解できなくても大丈夫です。プログラミングを深めていくと、突然の気づきが得られると思います。ぜひ一緒に進んでください。

php ファクトリー モード

それでは、ファクトリー モードとは何でしょうか?

名前から判断すると、何の手がかりもないようです。ファクトリーモード、生産​​に関連していますか?それとも製造過程に関係があるのでしょうか?それはまだ工場のリーダーと関係がある可能性がありますか?それはリーダー秘書と関係がありますか?長官…わかりました、あまり近づかないようにしましょう。いわゆる工場モデルは実際には生産に関連しています。何を生産するか?生成されるのはインスタンス オブジェクトです。製造にはどのような設備が使用されますか?ファクトリークラスを通じて生成されます。どうやって生産するのでしょうか?ファクトリ クラスは、独自の静的メソッドを呼び出してオブジェクト インスタンスを生成します。

ファクトリ パターンには、一般原則に従って Factory という名前の静的メソッドであるキー構造があります。ただし、これは単なる原則であり、ファクトリ メソッドはこの静的メソッドに任意の名前を付けることができ、パラメータも受け入れることができます。どのようなデータであっても、オブジェクトを返さなければなりません。

なぜファクトリーモードを使用するのでしょうか?

ファクトリ パターンに触れたことのない多くの人は、なぜオブジェクトを作成するためのファクトリ クラスの構築にこれほど多くの労力を費やさなければならないのかと疑問に思わずにはいられません。メンテナンスの容易さや拡張性などを適用する代わりに、このような単純な問題を考慮することができます。プロジェクト内の場合は、クラスを通じてオブジェクトを作成します。ほぼ完成している、または完成していて関数を拡張する必要がある場合、元のクラス名があまり適切ではないことが判明したり、関数拡張を実現するにはクラスにコンストラクター パラメーターを追加する必要があることがわかります。なんてことだ!このクラスを通じて多数のオブジェクト インスタンスを作成しましたが、それらを 1 つずつ変更する必要がありますか? 「高凝集性、低結合性」の広さと深さを今になって初めて感じます。問題ありません。ファクトリ メソッドでこの問題は解決できます。

  再考虑一下,我要连接数据库,在php里面就有好几种方法,mysql扩展,mysqli扩展,PDO扩展。我就是想要一个对象用来以后的操作,具体要哪个,视情况而定喽。既然你们都是连接数据库的操作,你们就应该拥有相同的功能,建立连接,查询,断开连接...(此处显示接口的重要性)。总而言之,这几种方法应该“团结一致,一致对外”。如何实现呢?利用工厂模式。

工厂模式如何实现?

  相对于单例模式,上面我们提供了足够的信息,工厂类,工厂类里面的静态方法。静态方法里面new一下需要创建的对象实例就搞定了。当然至于考虑上面的第二个问题,根据工厂类静态方法的参数,我们简单做个判断就好了。管你用if..else..还是switch..case..,能快速高效完成判断该创建哪个类的工作就好了。最后,一定要记得,工厂类静态方法返回一个对象。不是两个,更不是三个。

基本的工厂类:

//要创建对象实例的类
class MyObject{
}
 //工厂类
class MyFactory{
public static function factory(){
return new MyObject():
 }
}
$instance=MyFactory::factory();

一个稍微复杂的工厂模式:

<?php
interface Transport{
 public function go();
}
class Bus implements Transport{
 public function go(){
  echo "bus每一站都要停";
 }
}
class Car implements Transport{
 public function go(){
  echo "car跑的飞快";
 }
}
class Bike implements Transport{
 public function go(){
  echo "bike比较慢";
 }
}
class transFactory{
 public static function factory($transport)
 {
  switch ($transport) {
   case &#39;bus&#39;:
    return new Bus();
    break;
   case &#39;car&#39;:
    return new Car();
    break;
   case &#39;bike&#39;:
    return new Bike();
    break;
  }
 }
}
$transport=transFactory::factory(&#39;car&#39;);
$transport->go();

  需要工厂静态方法为factory()的时候,千万别再傻乎乎的把工厂类命名为Factory了。为啥啊?别忘了同名构造函数的事儿啊~

  最后还是谈点感受吧,很多新手比较眼高手低,刚刚会了if..else..,session,cookie就要来点高大上的了。与人交谈动辄可扩展性,可维护性之类云云,至于实例的话,就会一时语塞。有时候觉得,无论自己写代码还是和别人学习,都处于“众里寻他千百度”的时候,真正踏实学习后,蓦然回首,“那人却在灯火阑珊处”,大呼:“原来这TM就是***啊”。

  笔者不敢承认自己会模式设计,我也是个不足一年的初学者,分享博客只是想记录自己的学习历程,能得到知道更是求之不得。如果能给别人带来帮助,那就更好啦~~~

php单列模式

模式设计是什么?

     初学者一开始会被这高大上的名称给唬住。而对于有丰富编程经验的老鸟来说,模式设计又是无处不在。很多接触的框架就是基于各种模式设计形成的。 简单说,在写代码的过程中一开始往往接触的是面向过程的,简单的基础的编程。这个时候我们往往追求的是代码能够实现某项功能就万事大吉。管他代码多么冗余,管他代码是否可重用,管他效率如何,能实现功能就好。但是,真正应用于实际的,更被大家采纳的是那些高效的,可重用的,便于团队开发的代码。基于这些因素,你不能像练手一样,随便命名函数名,随便放置脚本。模式设计告诉是给人们组织代码提供一种思路,实现可重用代码、让代码更容易被他人理解、保证代码可靠性。

  在所有模式设计中,有三种基础设计模式,单例模式,工厂模式,注册树模式,其他模式往往基于这几种模式,下面介绍的是单例模式。

什么是单例模式?

  根据这个名称,我们很容易了解到,单例模式指的是在整个应用中只有一个对象实例的设计模式。

为什么要用单例模式?

  php常常和数据库打交道,如果在应用中如果频繁建立连接对象,进行new操作的话,会消耗大料的系统内存资源,这并不是我们希望看到的。再则,在团队合作项目中,单例模式可以有效避免不同程序员new自己的对象,造成人为的系统消耗。

如何建立单例模式?

  在看到这个问题的时候,相信优秀的程序员很可能自己试着根据要求去创建单例模式,而不是坐等前人的经验。区别于其他博友告诉你什么样的模式是单例模式,我人更愿意和有面向对象编程基本经验的你考虑一下如何自己建立单例模式。

  我们首先从题目出发,单例模式是只有一个对象实例的设计模式。这一点是很让人蛋疼的。我们平常创建的类不是能创建很多对象的,就是不能创建对象的(抽象类)。要创建对象需要有类这是必须的,而且不能是抽象类。这个类要防止别人可以多次创建函数。我们自然而然考虑到了从构造函数入手。但是,每次new操作都会调用构造函数,也就是会多次创建对象实例。这和我们设计初衷相悖了。在此处务必申明构造函数为private或者protected这样才能解决这个问题。

  构造函数被申明为private或者protected这注定无法通过new的方法创建实例对象了。而且我们发现,经过这一步处理后,解决问题的前景变得明朗起来?为什么呢?既然无法通过new方法创建对象实例,那么我们只能通过类内的方法来创建对象实例了。 这个时候我们面临一个有趣的先有鸡还是先有蛋的问题。我们往往往往是创建了对象后才调用对象的方法,而此时需要调用类里面的方法来创建对象。不受是否创建对象影响都能调用的方法的解决方案毋庸置疑那就是利用关键字--static。

  在类内创建静态方法完成完成什么工作呢?回归主题:确保只创建一个实例对象。如何确保只有一个呢?这很简单,if判断一下啊。存在的话直接返回,不存在自己创建一个嘛。当然这个实例对象是类的静态属性。至此,单例模式要求的功能实现完成。真的完成了么?还不算~如果有个类继承本类,将构造方法申明为public那不又坏事儿了?那有必要在构造方法前加final关键字了。

最后贴上单例模式代码,代码解释都在上面了~~

<?php
class Single{
 public $hash;
 static protected $ins=null;
  final protected function __construct(){
  $this->hash=rand(1,9999);
 }
 static public function getInstance(){
  if (self::$ins instanceof self) {
   return self::$ins;
  }
  self::$ins=new self();
  return self::$ins;
 } 
}

总结:以上就是本篇文的全部内容,希望能对大家的学习有所帮助。

相关推荐:

PHP实现自动发送邮件功能代码(qq 邮箱)_php实例

php实现追加内容到txt文件中的方法

PHP无限循环获取MySQL数据

以上がPHPデザインパターンの基礎知識と応用の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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