>  기사  >  백엔드 개발  >  PHP 디자인 패턴의 기본 지식 및 응용

PHP 디자인 패턴의 기본 지식 및 응용

墨辰丷
墨辰丷원래의
2018-06-07 13:57:581194검색

이 글은 주로 PHP 디자인 패턴의 기본 지식과 응용을 소개합니다. 관심 있는 친구들이 참고하면 좋겠습니다.

php 등록 트리 모드

등록 트리 모드란 무엇인가요?

 등록 트리 모드는 물론 등록 모드, 등록자 모드라고도 합니다. 여기서 이름을 가식적으로 표현하는 이유는 이름 등록 트리가 사람들이 이해하기 더 쉽다고 생각하기 때문입니다. 이전 두 기사와 마찬가지로 우리 기사도 여전히 이름으로 시작됩니다. 등록 트리 패턴은 객체 인스턴스를 전역 객체 트리에 등록하고 필요할 때 객체 트리에서 선택하는 패턴 설계 방법입니다. 이것은 내가 어렸을 때 설탕에 절인 산사나무를 샀던 것을 생각나게 합니다. 설탕에 절인 산사나무 판매자는 설탕에 절인 산사나무를 큰 기둥에 꽂고 사람들은 그것을 살 때 그것을 떼어내곤 했습니다. 차이점은 등록 트리 모드에서는 선택 후에도 일부가 남아 있어 여러 번 선택할 수 있지만 설탕에 절인 산사나무는 한 번 선택하면 사라집니다. . .

등록 트리 모드를 사용하는 이유는 무엇인가요?

싱글턴 패턴은 프로젝트 전체에서 고유한 객체 인스턴스를 생성하는 방법의 문제를 해결하고, 팩토리 패턴은 new를 사용하지 않고 인스턴스 객체를 생성하는 방법의 문제를 해결합니다. 그렇다면 등록 트리 모드는 어떤 문제를 해결하려고 할까요? 이 문제를 고려하기 전에 처음 두 모델이 현재 직면하고 있는 한계를 고려해야 합니다. 우선 싱글톤 모드에서 고유한 객체를 생성하는 과정 자체에도 객체가 존재하는지 판단하는 과정이 있다. 존재하면 객체가 반환되고, 존재하지 않으면 객체가 생성되어 반환됩니다. 인스턴스 객체가 생성될 때마다 이러한 판단 계층이 있어야 합니다. 공장 모델은 연장된 유지 관리 문제를 더 많이 고려합니다. 일반적으로 싱글톤 패턴과 팩토리 패턴이 더 합리적인 객체를 생성할 수 있습니다. 이러한 객체를 편리하게 호출하는 방법은 무엇입니까? 더욱이, 프로젝트에서 이렇게 생성된 오브제는 흩어진 병사들과 같아서 전체적인 관리와 배치가 불편하다. 따라서 등록 트리 모델이 탄생했습니다. 싱글톤 모드, 팩토리 모드 또는 둘의 조합을 통해 개체를 생성하는지 여부에 관계없이 해당 개체는 모두 등록 트리에 "삽입"됩니다. 개체를 사용할 때 등록 트리에서 직접 가져옵니다. 이는 전역 변수를 사용하는 것만큼 편리하고 실용적입니다. 그리고 등록 트리 패턴은 다른 패턴에 대한 아주 좋은 아이디어도 제공합니다.

등록 트리를 구현하는 방법은 무엇입니까?

위의 설명을 통해 해결 방법을 쉽게 찾을 수 있을 것 같습니다. 먼저 등록 트리로 클래스가 필요합니다. 모든 개체는 등록 트리에 "삽입"됩니다. 이 등록 트리는 정적 변수에 의해 제공되어야 합니다. 그리고 이 등록 트리는 2차원 배열이어야 합니다. 이 클래스에는 객체 인스턴스를 삽입하는 메서드(set())가 있어야 하며, 그에 따라 객체 인스턴스를 실행 취소하는 메서드(_unset())가 있어야 합니다. 물론 가장 중요한 것은 객체를 읽는 메소드(get())를 갖는 것입니다. 이것으로 기분 좋게 등록 트리 모드를 완성할 수 있어요~~

세 가지 모드를 작게 조합해 보겠습니다. 단순히 인스턴스 객체를 생성하는 것은 훨씬 덜 복잡하지만 대규모 프로젝트에 적용하면 편의성은 자명합니다.

<?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);

이제 세 가지 디자인 모드 소개가 완료되었습니다. 다양한 패턴 디자인 자체는 서로를 보완할 것입니다. 향후 다른 패턴을 도입할 때는 하나 이상의 다른 디자인 패턴이 어느 정도 사용될 것입니다.

 특정 모델을 이해하지 못해도 프로그래밍이 깊어지면 놀라움과 깨달음이 있을 것이라고 믿습니다.

php 팩토리 모드

그럼 팩토리 모드란 무엇일까요?

이름으로 보아 단서가 없는 것 같습니다. 생산과 관련된 공장 모드? 아니면 생산과정과 관련이 있는 걸까요? 공장장과 관련이 있는 걸까요? 리더십 비서와 관련이 있습니까? 비서... 알았어, 너무 가까이 다가가지 말자. 이른바 공장 모델은 실제로 생산과 관련이 있다. 무엇을 생산할까요? 생성되는 것은 인스턴스 객체입니다. 그것을 생산하는 데 어떤 장비가 사용됩니까? 공장 수업을 통해 생산됩니다. 그것을 생산하는 방법? 팩토리 클래스는 자체 정적 메서드를 호출하여 개체 인스턴스를 생성합니다.

팩토리 패턴에는 일반 원칙에 따라 Factory라는 정적 메서드인 핵심 구성이 있습니다. 그러나 이는 단지 원칙일 뿐입니다. 팩토리 메서드의 이름은 임의로 지정할 수 있지만 이 정적 메서드는 모든 데이터의 매개변수를 받아들일 수도 있습니다. 그리고 객체를 반환해야 합니다.

공장 모드를 사용하는 이유는 무엇인가요?

팩토리 패턴을 접해본 적이 없는 많은 사람들은 '왜 객체를 생성하기 위해 팩토리 클래스를 구성하는 데 그렇게 많은 노력을 기울여야 하는가?'라고 묻지 않을 수 없습니다. 유지보수 용이성, 확장성 등을 적용하는 대신 이런 간단한 문제를 생각해 볼 수도 있습니다. 프로젝트에서는 클래스를 통해 객체를 생성합니다. 거의 완료되었거나 완료되어 함수를 확장해야 할 때 원래 클래스 이름이 그다지 적합하지 않거나 클래스가 함수 확장을 달성하기 위해 생성자 매개변수를 추가해야 하는 것으로 나타났습니다. 젠장! 이 클래스를 통해 많은 객체 인스턴스를 생성했는데, 그래도 하나씩 변경해야 합니까? 이제야 우리는 "높은 응집력과 낮은 결합력"의 폭과 깊이를 느낄 수 있습니다. 문제 없습니다. 팩토리 메소드를 사용하면 이 문제를 해결할 수 있습니다.

  再考虑一下,我要连接数据库,在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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.