PHP 8 대 디자인 모델 사례 상세 설명
자바 의 가방 과 유사 하 게 코드 를 잘 구성 할 수 있 습 니 다.
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단일 모델 은 전체 프로젝트 에서 유일한 대상 인 스 턴 스 를 만 드 는 문 제 를 해결 하고 공장 모델 은 new 를 통 해 인 스 턴 스 대상 을 만 들 지 않 는 방법 을 해결 합 니 다.
단일 모드
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 대 디자인 모델 내용 은 예전 의 글 을 검색 하거나 아래 의 관련 글 을 계속 조회 하 시기 바 랍 니 다.앞으로 저 희 를 많이 사랑 해 주세요!
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
laravel에 yo에서 angularJs&coffeescript를 사용할 수 있도록 한다.먼저 yo 명령을 사용할 수 있어야하므로 아래에서 설치 global에 설치한 곳에서 laravel의 프로젝트 루트로 이동. 클라이언트 코드를 관리하는 디렉토리를 만들고 이동합니다. 클라이언트 환경 만들기 이것으로 히...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.