PHP 8 대 디자인 모델 사례 상세 설명

15941 단어 PHP디자인 모드
PHP 네 임 스페이스
자바 의 가방 과 유사 하 게 코드 를 잘 구성 할 수 있 습 니 다.

Test1.php
<?php
namespace Test1;//    Test1
function test(){
    echo __FILE__;
}
Test2.php
<?php
namespace Test2; //    Test2
function test(){
    echo __FILE__;//             。
}
Test.php
<?php
require 'Test1.php';
require 'Test2.php';
Test1\test();//      ,             。Test1      ,test()             。
echo "<br>";
Test2\test();
실행 결과
这里写图片描述
요약:상기 코드 를 통 해 서로 다른 네 임 스페이스 에서 같은 이름 이나 방법 명 을 가 질 수 있 음 을 알 수 있 습 니 다.
클래스 자동 불 러 오기
PHP 항목 이 커지 면서 하나의 PHP 파일 앞 에 여러 가지 의존 하 는 PHP 파일 을 포함 하 는 require 가 많 습 니 다.어떤 클래스 가 삭제 되 지만 다른 파일 에서 가 져 오 는 경우 치 명 적 인 오류 가 발생 할 수 있 습 니 다.이상 의 문 제 를 해결 하 는 방법 은 바로autoload()함수.

Test1.php
<?php
class Test1{
    static function test(){
        echo __FILE__;
    }
}
Test2.php
<?php
class Test2
{
    static function test(){
        echo __FILE__;
    }
}
Test.php
<?php
Test1::test();
Test2::test();

function __autoload($class){
    $dir  = __DIR__;
    $requireFile = $dir."\\".$class.".php";
    require $requireFile;
}
PHP 는 이 코드 를 사용 하여 포함 할 파일 을 동적 으로 불 러 옵 니 다.어떤 종 류 를 사용 하고 이 종 류 는 파일 에 포함 되 지 않 으 면 를 호출 합 니 다.autoload()함수,이 파일 을 동적 으로 불 러 옵 니 다.하지만 여러 프레임 을 사용 할 때 프레임 마다 자신의 가 있 습 니 다.autoload()가 실현 되 기 때문에 파일 을 중복 가 져 올 수 있 습 니 다.

<?php
spl_autoload_register('autoload1');
spl_autoload_register('autoload2');
//          ,             ,                 。
Test1::test();
Test2::test();

function autoload1($class){
    $dir  = __DIR__;
    $requireFile = $dir."\\".$class.".php";
    require $requireFile;
}
function autoload2($class){
    $dir  = __DIR__;
    $requireFile = $dir."\\".$class.".php";
    require $requireFile;
}
PSR-0
  • PHP 의 네 임 스페이스 는 절대 경로 와 일치 해 야 합 니 다.
  • 유형 이니셜 대문자4.567917.입구 파일 을 제외 하고 다른 PHP 파일 은 하나의 클래스 여야 하 며 실행 코드 가 있어 서 는 안 됩 니 다디자인 모드
    단일 모델 은 전체 프로젝트 에서 유일한 대상 인 스 턴 스 를 만 드 는 문 제 를 해결 하고 공장 모델 은 new 를 통 해 인 스 턴 스 대상 을 만 들 지 않 는 방법 을 해결 합 니 다.
    단일 모드
  • $_instance 는 정적 인 개인 변수 로 밝 혀 야 합 니 다
  • 4.567917.구조 함수 와 분석 함 수 는 반드시 사유 로 성명 하고 외부 프로그램 new 류 가 단일 모델 의 의 미 를 잃 는 것 을 방지 해 야 한다
  • getInstance()방법 은 공유 로 설정 해 야 합 니 다.이 방법 을 사용 하여 인 스 턴 스 의 인용 을 되 돌려 야 합 니 다
  • :조작 자 는 정적 변수 와 정적 함수 에 만 접근 할 수 있 습 니 다
  • new 대상 은 모두 메모 리 를 소모 합 니 다4.567917.장면 사용:가장 자주 사용 하 는 곳 은 데이터 베이스 연결 이다4.567917.단일 모드 로 대상 을 만 든 후에 이 대상 은 다른 여러 대상 에 의 해 사용 할 수 있다사유클론()방법 복제 방지 대상하나의 예 모드 로 특정한 유형의 대상 이 하나만 만 들 수 있 도록 합 니 다.구조 함수 private 수식,
    static getInstance 방법 을 설명 하고 이 방법 에서 대상 의 인 스 턴 스 를 만 듭 니 다.이 인 스 턴 스 가 존재 한다 면 만 들 지 않 습 니 다.예 를 들 어 데이터베이스 연결 만 만 들 면 됩 니 다.
    공장 모드
    공장 모드,공장 방법 또는 클래스 생 성 대상 은 코드 에서 직접 new 가 아 닙 니 다.
    공장 모드 를 사용 하면 특정한 종류의 이름 이나 방법 을 바 꾼 후에 이런 종류의 모든 코드 에서 이름 이나 파 라 메 터 를 수정 하 는 것 을 피 할 수 있 습 니 다.
    
    Test1.php
    <?php
    class Test1{
        static function test(){
            echo __FILE__;
        }
    }
    
    Factory.php
    <?php
    class Factory{
        /*
         *              new ClassName(),          
         *             ,         ,        PHP
         *   ,         ,                。
         */
        static function createDatabase(){
            $test = new Test1();
            return $test;
        }
    }
    
    Test.php
    <?php
    spl_autoload_register('autoload1');
    
    $test = Factory::createDatabase();
    $test->test();
    function autoload1($class){
        $dir  = __DIR__;
        $requireFile = $dir."\\".$class.".php";
        require $requireFile;
    }
    
    这里写图片描述
    
    Test1.php
    <?php
    class Test1{
        protected static  $tt;
        private function __construct(){}
        static function getInstance(){
            if(self::$tt){
                echo "      <br>";
                return self::$tt;
            }else {
                self::$tt = new Test1();
                echo "    <br>";
                return self::$tt;
            }
        }
         function echoHello(){
            echo "Hello<br>";
        }
    }
    Test.php
    <?php
    spl_autoload_register('autoload1');
    
    $test = Test1::getInstance();
    $test->echoHello();
    $test = Test1::getInstance();
    $test->echoHello();
    $test = Test1::getInstance();
    $test->echoHello();
    $test = Test1::getInstance();
    $test->echoHello();
    function autoload1($class){
        $dir  = __DIR__;
        $requireFile = $dir."\\".$class.".php";
        require $requireFile;
    }
    
    등록 모드
    등록 모드,전역 공유 와 교환 대상 해결.이미 만들어 진 대상 은 전역 적 으로 사용 할 수 있 는 배열 에 걸 려 있 으 며,사용 해 야 할 때 이 배열 에서 직접 가 져 오 면 됩 니 다.대상 을 전역 트 리 에 등록 합 니 다.어디 든 직접 방문 하 다.
    
    <?php
    
    class Register
    {
        protected static  $objects;
        function set($alias,$object)//           
        {
            self::$objects[$alias]=$object;//       
        }
        static function get($name){
            return self::$objects[$name];//            
        }
        function _unset($alias)
        {
            unset(self::$objects[$alias]);//            。
        }
    }
    
    어댑터 모드
    다양한 전혀 다른 함수 인 터 페 이 스 를 통 일 된 API 로 밀봉 합 니 다.
    PHP 의 데이터 베 이 스 는 MySQL,MySQL,PDO 세 가지 가 있 으 며 어댑터 모드 로 일치 시 켜 서로 다른 데이터 베 이 스 를 같은 API 로 통일 할 수 있 습 니 다.유사 한 장면 은 cache 어댑터 도 있 습 니 다.memcache,redis,file,apc 등 서로 다른 캐 시 함 수 를 일치 시 킬 수 있 습 니 다.
    먼저 인 터 페 이 스 를 정의 합 니 다.그 다음 에 몇 가지 다른 상황 이 있 으 면 몇 가지 유형 을 써 서 이 인 터 페 이 스 를 실현 한다.비슷 한 기능 을 완성 하 는 함 수 를 일치 하 는 방법 으로 통일 합 니 다.
    
       IDatabase
    <?php
    namespace IMooc;
    interface IDatabase
    {
        function connect($host, $user, $passwd, $dbname);
        function query($sql);
        function close();
    }
    
    
    MySQL
    <?php
    namespace IMooc\Database;
    use IMooc\IDatabase;
    class MySQL implements IDatabase
    {
        protected $conn;
        function connect($host, $user, $passwd, $dbname)
        {
            $conn = mysql_connect($host, $user, $passwd);
            mysql_select_db($dbname, $conn);
            $this->conn = $conn;
        }
    
        function query($sql)
        {
            $res = mysql_query($sql, $this->conn);
            return $res;
        }
    
        function close()
        {
            mysql_close($this->conn);
        }
    }
    
    MySQLi
    <?php
    namespace IMooc\Database;
    use IMooc\IDatabase;
    class MySQLi implements IDatabase
    {
        protected $conn;
    
        function connect($host, $user, $passwd, $dbname)
        {
            $conn = mysqli_connect($host, $user, $passwd, $dbname);
            $this->conn = $conn;
        }
    
        function query($sql)
        {
            return mysqli_query($this->conn, $sql);
        }
    
        function close()
        {
            mysqli_close($this->conn);
        }
    }
    
    PDO
    <?php
    namespace IMooc\Database;
    use IMooc\IDatabase;
    class PDO implements IDatabase
    {
        protected $conn;
        function connect($host, $user, $passwd, $dbname)
        {
            $conn = new \PDO("mysql:host=$host;dbname=$dbname", $user, $passwd);
            $this->conn = $conn;
        }
    function query($sql)
        {
            return $this->conn->query($sql);
        }
    
        function close()
        {
            unset($this->conn);
        }
    }
    상기 사례 를 통 해 PHP 와 MySQL 의 데이터 베 이 스 는 세 개의 API 가 있 습 니 다.서로 다른 장면 에서 서로 다른 API 를 사용 할 수 있 습 니 다.그러면 좋 은 코드 를 개발 하고 환경 을 바 꾸 면 데이터베이스 API 를 바 꿔 야 할 수도 있 습 니 다.그러면 모든 코드 를 바 꾸 고 어댑터 모드 를 사용 한 후에...기본 API 차이 로 인 한 환경 변 화 를 차단 하기 위해 통 일 된 API 를 사용 할 수 있 습 니 다.
    전략 모드
    정책 모드 는 특정한 행위 와 알고리즘 을 클래스 로 봉 하여 특정한 상하 문 환경 에 적응 하도록 한다.
    eg:만약 에 전자상거래 사이트 시스템 이 있다 면 남성 여성 사용 자 를 대상 으로 서로 다른 상품 유형 으로 전환 하고 모든 광고 위치 에서 서로 다른 광 고 를 보 여 줘 야 합 니 다.전통 적 인 코드 에 서 는 시스템 에 각종 if else 의 판단,하 드 코딩 을 추가 하 는 방식 입 니 다.어느 날 사용자 가 추가 되면 코드 를 고 쳐 써 야 한다.정책 모드 를 사용 합 니 다.사용자 형식 을 새로 추가 하면 하나의 정책 만 추가 하면 됩 니 다.다른 모든 곳 은 다른 전략 만 사용 하면 된다.
    먼저 정책 의 인터페이스 파일 을 설명 하고 정책 에 포 함 된 행동 을 약속 합 니 다.그 다음 에 각 구체 적 인 전략 실현 류 를 정의 한다.
    
    UserStrategy.php
    <?php
    /*
     *          ,         。
     */
    interface UserStrategy
    {
        function showAd();
        function showCategory();
    }
    
    
    FemaleUser.php
    <?php
    require_once 'Loader.php';
    class FemaleUser implements UserStrategy
    {
        function showAd(){
            echo "2016    ";
        }
        function showCategory(){
            echo "  ";
        }
    }
    
    
    MaleUser.php
    <?php
    require_once 'Loader.php';
    class MaleUser implements UserStrategy
    {
        function showAd(){
            echo "IPhone6s";
        }
        function showCategory(){
            echo "    ";
        }
    }
    
    
    Page.php//    
    <?php
    require_once 'Loader.php';
    class Page
    {
        protected $strategy;
        function index(){
            echo "AD";
            $this->strategy->showAd();
            echo "<br>";
            echo "Category";
            $this->strategy->showCategory();
            echo "<br>";
        }
        function setStrategy(UserStrategy $strategy){
            $this->strategy=$strategy;
        }
    }
    
    $page = new Page();
    if(isset($_GET['male'])){
        $strategy = new MaleUser();
    }else {
        $strategy = new FemaleUser();
    }
    $page->setStrategy($strategy);
    $page->index();
    실행 결과 그림:
    这里写图片描述
    这里写图片描述
    요약:
    상기 방식 을 통 해 서로 다른 사용자 가 로그 인 할 때 서로 다른 내용 을 표시 하지만 표시 할 때 하 드 인 코딩 문 제 를 해결 한 것 을 알 수 있 습 니 다.하나의 정책 을 추가 하려 면 하나의 정책 실현 클래스 를 추가 한 다음 에 입구 파일 에서 판단 을 실행 하고 이 클래스 에 들 어가 면 됩 니 다.결합 을 풀다.
    의존 반전 과 제어 반전 실현(이해 필요)
    인터페이스 방식 을 통 해 클래스 와 클래스 간 에 직접 의존 하지 않도록 합 니 다.이 종 류 를 사용 할 때 만 이 인터페이스 에 동적 으로 들 어 오 는 실현 류 입 니 다.어떤 종 류 를 교체 하려 면 이 인 터 페 이 스 를 실현 하 는 실현 류 를 제공 하고 한 줄 의 코드 를 수정 하면 교 체 를 완성 할 수 있다.
    관찰자 모드
    1:관찰자 모드(Observer)는 대상 의 상태 가 바 뀌 면 의존 하 는 대상 이 모두 알림 을 받 고 자동 으로 업 데 이 트 됩 니 다.
    2:장면:한 사건 이 발생 한 후에 일련의 업데이트 작업 을 수행 해 야 합 니 다.전통 적 인 프로 그래 밍 방식 은 사건 의 코드 뒤에 처리 논 리 를 직접 넣 는 것 이다.업 데 이 트 된 논리 가 증가 하면 코드 를 유지 하기 어려워 집 니 다.이런 방식 은 결합 적 이 고 침입 적 이 며 새로운 논 리 를 추가 하려 면 사건 의 주체 코드 를 수정 해 야 한다.
    3:관찰자 모드 는 저 결합,비 침입 식 알림 과 업데이트 체 제 를 실현 합 니 다.
    이벤트 트리거 추상 클래스 를 정의 합 니 다.
    
    EventGenerator.php
    <?php
    require_once 'Loader.php';
    abstract class EventGenerator{
        private $observers = array();
        function addObserver(Observer $observer){
            $this->observers[]=$observer;
        }
        function notify(){
            foreach ($this->observers as $observer){
                $observer->update();
            }
        }
    }
    
    관찰자 인터페이스 정의
    
    Observer.php
    <?php
    require_once 'Loader.php';
    interface Observer{
        function update();//                
    }
    
    <?php
    //     EventGenerator     ,             
    require 'Loader.php';
    class Event extends EventGenerator{
        function triger(){
            echo "Event<br>";
        }
    }
    class Observer1 implements Observer{
        function update(){
            echo "  1<br>";
        }
    }
    class Observer2 implements Observer{
        function update(){
            echo "  2<br>";
        }
    }
    $event = new Event();
    $event->addObserver(new Observer1());
    $event->addObserver(new Observer2());
    $event->triger();
    $event->notify();
    어떤 사건 이 발생 한 후에 실행 해 야 할 논리 가 증가 할 때 느슨 한 결합 방식 으로 논 리 를 삭제 할 수 있다.즉,코드 중의 빨간색 부분 은 관찰자 인 터 페 이 스 를 실현 하 는 클래스 를 정의 하고 복잡 한 논 리 를 실현 한 다음 에 빨간색 부분 에 코드 를 한 줄 추가 하면 된다.이렇게 저 결합 을 실현 하 였 다.
    원형 모드
    프로 토 타 입 모드(대상 복 제 는 대상 을 만 들 때 소모 되 지 않도록 합 니 다)
    1:공장 모델 과 유사 하여 모두 대상 을 만 드 는 데 사 용 됩 니 다.
    2:공장 모델 의 실현 과 달리 원형 모델 은 먼저 원형 대상 을 만 든 다음 에 clone 원형 대상 을 통 해 새로운 대상 을 만 드 는 것 이다.이렇게 하면 클래스 생 성 시 반복 되 는 초기 화 작업 을 면제 합 니 다.
    3:프로 토 타 입 모드 는 큰 대상 의 생 성 에 적용 되 며,큰 대상 을 만 드 는 데 많은 비용 이 필요 합 니 다.매번 new 가 소모 되면 프로 토 타 입 모드 는 메모리 복사 만 하면 됩 니 다.
    
    Canvas.php
    <?php
    require_once 'Loader.php';
    class Canvas{
    private $data;
    function init($width = 20, $height = 10)
        {
            $data = array();
            for($i = 0; $i < $height; $i++)
            {
                for($j = 0; $j < $width; $j++)
                {
                    $data[$i][$j] = '*';
                }
            }
            $this->data = $data;
        }
    function rect($x1, $y1, $x2, $y2)
        {
            foreach($this->data as $k1 => $line)
            {
                if ($x1 > $k1 or $x2 < $k1) continue;
               foreach($line as $k2 => $char)
                {
                  if ($y1>$k2 or $y2<$k2) continue;
                    $this->data[$k1][$k2] = '#';
                }
            }
        }
    
        function draw(){
            foreach ($this->data as $line){
                foreach ($line as $char){
                    echo $char;
                }
                echo "<br>;";
            }
        }
    }
    
    
    Index.php
    <?php
    require 'Loader.php';
    $c = new Canvas();
    $c->init();
    / $canvas1 = new Canvas();
    // $canvas1->init();
    $canvas1 = clone $c;//    ,    init()  ,         
    //       。                 ,  new     ,  
    //        。
    $canvas1->rect(2, 2, 8, 8);
    $canvas1->draw();
    echo "-----------------------------------------<br>";
    // $canvas2 = new Canvas();
    // $canvas2->init();
    $canvas2 = clone $c;
    $canvas2->rect(1, 4, 8, 8);
    $canvas2->draw();
    실행 결과:
    这里写图片描述
    장식 기 모드
    1:장식 기 모드,수 정 된 기능 을 동적 으로 추가 할 수 있 습 니 다.
    2:하나의 클래스 는 하나의 기능 을 제공 합 니 다.만약 에 추가 기능 을 수정 하고 추가 하려 면 전통 적 인 프로 그래 밍 모델 은 하위 클래스 를 써 서 계승 하고 실현 하 는 방법 을 다시 써 야 합 니 다.
    3:장식 기 모델 을 사용 하면 운행 할 때 장식 기 대상 을 추가 하면 실현 할 수 있 고 최대 유연성 을 실현 할 수 있다.
    여기 서 PHP 8 대 디자인 모델 사례 에 대한 상세 한 설명 은 여기까지 입 니 다.더 많은 관련 PHP 8 대 디자인 모델 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!

    좋은 웹페이지 즐겨찾기