백엔드 개발 PHP 튜토리얼 PHP 공통 디자인 패턴 싱글톤, 팩토리, 관찰자, 책임 체인, 장식, 전략, 적응, 브리지 모드

PHP 공통 디자인 패턴 싱글톤, 팩토리, 관찰자, 책임 체인, 장식, 전략, 적응, 브리지 모드

Aug 08, 2016 am 09:20 AM
content function gt lt public

// 多态, 在JAVA中是这样用的, 其实在PHP当中可以自然消除, 因为参数是动态的, 你传什么过来都可以, 不限制类型, 直接调用类的方法
abstract class Tiger {
    public abstract function climb();
}

class XTiger extends Tiger {
    public function  climb() {
        echo '摔下来';
    }
}

class MTiger extends Tiger {
    public function climb() {
        echo '爬到树顶';
    }
}

class Client {
    public static function call(Tiger $animal) {
        $animal->climb();
    }
}

Client::call(new XTiger());
Client::call(new MTiger());
로그인 후 복사
// 面向对象里面有一个面向接口开发, 就是一个共同的规格, 你生产插座, 我生产插头

// 共同接口
interface db {
    function conn();
}

// 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
    public function conn() {
        echo '连上了MySQL';
    }
}

class dbsqlite implements db{
    public function conn() {
        echo '连上了sqlite';
    }
}

// 客户端, 看不到dbmysql, dbsqlite的内部细节的, 只知道上两个类实现了db接口.

$db = new dbmysql();
$db->conn();          // 因为知道这个类实现了db接口, 所以知道有这个conn类

$sqlite = new dbsqlite();
$sqlite->conn();

// 我连我有哪些类我都不希望告诉客户端, 那么怎么进一步进行封装
// 发生连接的双方知道的越少越好, 你还知道我有两个类
로그인 후 복사
// 简单工厂

// 面向对象里面有一个面向接口开发, 就是一个共同的规格, 你生产插座, 我生产插头

// 共同接口
interface db {
    function conn();
}

// 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
    public function conn() {
        echo '连上了MySQL';
    }
}

class dbsqlite implements db{
    public function conn() {
        echo '连上了sqlite';
    }
}

// 简单工厂
class Factory {
    public static function createDB($type) {
        if($type == 'mysql') {
            return new dbmysql();
        } elseif ($type=='sqlite') {
            return new dbsqlite();
        } else {
            throw new Exception("Error db type", 1);
        }
    }
}

// 客户端现在不知道对方到底有哪些类名了
// 只知道对方开放了一个Factory::createDB方法
// 方法允许传递数据库名称

$mysql = Factory::createDB('mysql');
$mysql->conn();

$sqlite = Factory::createDB('sqlite');
$sqlite->conn();

// 原本你知道服务器端的两个类名, 觉得你知道的太多, 再封装起来, 只给一个通道, 更好的适应变化
// 如果以后新增oracle类型, 怎么办?
// 我们PHP随手改了就行, 像JAVA打包一次很麻烦, 又要修改服务端内容
// 服务端要修改Factory的内容(在java, c++中, 改后还得再编译)
// 这个时候就想如何来改进呢
// 在OOD(面向对象设计)的法则中, 有重要的开闭原则--对于修改是封闭的, 对于扩展是开放的.
// 你可以新增一个源代码, 不要修改旧的代码

//现在用第二种办法, 叫工厂方法
로그인 후 복사
// 共同接口
interface db {
    function conn();
}

interface Factory {
    function createDB();
}

// 服务端开发(不知道将会被谁调用)
class dbmysql implements db{
    public function conn() {
        echo '连上了MySQL';
    }
}

class dbsqlite implements db{
    public function conn() {
        echo '连上了sqlite';
    }
}

class mysqliFactory implements Factory{
    public function createDB() {
        return new dbmysql();
    }
}

class sqliteFactory implements Factory {
    public function createDB() {
        return new dbsqlite();
    }
}

// 服务器端添加oracle类
// 前面的代码不用改
// 我就新增一个数据库驱动类和一个工厂, 这样就避免了对源代码的修改
class dboracle implements db {
    public function conn() {
        echo '连接上了oracle';
    }
}

class oracleFactory implements Factory {
    public function createDB() {
        return new dboracle();
    }
}


// 客户端开始, 对方给了两个api, 一个db的api, 一个是创造数据库的api
$fact = new mysqliFactory();
$db = $fact->createDB();
$db->conn();

$fact = new sqliteFactory();
$db = $fact->createDB();
$db->conn();
로그인 후 복사
// 单例
// 一般来说一个中小型网站一个db去连接数据库就行了
// 想想, 能不能只有一个db类, 一个upload类, 一个cookie类
// 类肯定只有一个, 如何保证类的实例也只有一个

// 2个对象是同一个的时候才全等

// 单例模式

class single {
    protected static $ins = null;

    // 控制权限, 封锁new操作, 把大门关上了, 需要留一个小窗户
    // 方法前加final, 则方法不能被覆盖, 类前加final, 则类不能被继承
    final protected function __construct() {}
    // 防clone
    final protected function __clone(){}
    
    //留一个接口来new对象
    public static function getIns() {
        if(self::$ins == null) {
            self::$ins = new self();
        }
        return self::$ins;
    }
}

$s1 = single::getIns();
$s2 = single::getIns();

if ($s1 === $s2) {
    echo '是一个对象';
} else {
    echo '不是一个对象';
}
로그인 후 복사
<!DOCTYPE HTML>
<html>

<head>
    <title>colour_blue</title>
    <meta name="description" c />
    <meta name="keywords" c />
    <meta http-equiv="content-type" c />
    <style>
        div{
            margin:10px;
            width:500px;
            height:200px;
            border: 1px solid green;
        }
        #content {
        }
        #ad {
        }
    </style>
    <script>
        function t() {
            var sel = document.getElementsByTagName('select')[0];
//            alert(sel.value);
            if(sel.value == 'male') {
                document.getElementById('content').style.backgroundColor = 'gray';
                document.getElementById('ad').innerHTML = '汽车';
            } else if(sel.value=='female') {
                document.getElementById('content').style.backgroundColor = 'pink';
                document.getElementById('ad').innerHTML = '减肥';
            }
        }

        /**
         *
         * 观察上述代码, 如果新增了一个study区, 在切换时, 学习内容也要随之切换, 那么, 就需要改动T函数! 对于修改又开放了.
         * 思考---如果需要新监听footer区, 如何能不改原来的代码, 而只增加
         */
    </script>
</head>

<body>
    <h1>面向过程, 不用任务来切换</h1>
    <select name=""  name="code">// 比如登录, 在登录的时候出于安全考虑要记录上次登录时间
// 出于商业考虑, 给你推荐商品

class user implements SplSubject {
    public $lognum;
    public $hobby;

    protected $observers = null;

    public function __construct($hobby) {
        $this->lognum = rand(1, 10);
        $this->hobby = $hobby;
        $this->observers = new SplObjectStorage();
    }

    public function login() {
        // 操作session
        $this->notify();
    }

    public function attach(SplObserver $observer) {
        $this->observers->attach($observer);
    }

    public function detach(SplObserver $observer) {
        $this->observers->detach($observer);
    }

    public function notify() {
        $this->observers->rewind();
        while($this->observers->valid()) {
            $observer = $this->observers->current();
            $observer->update($this);
            $this->observers->next();
        }
    }
}

class secrity implements SplObserver {
    public function update(SplSubject $subject) {
        if($subject->lognum < 3) {
            echo '这是第'.$subject->lognum.'次安全登录';
        } else {
            echo '这是第'.$subject->lognum.'次登录,异常';
        }
    }
}

class ad implements SplObserver {
    public function update(SplSubject $subject) {
        if($subject->hobby == 'sports') {
            echo '台湾英锦赛';
        } else {
            echo '好好学习天天向上';
        }
    }
}

// 实施观察
$user = new user('sports');
$user->attach(new secrity());
$user->attach(new ad());

$user->login();
로그인 후 복사
<!DOCTYPE HTML>
<html>

<head>
    <title>colour_blue</title>
    <meta name="description" c />
    <meta name="keywords" c />
    <meta http-equiv="content-type" c />
    <style>
        div{
            margin:10px;
            width:500px;
            height:200px;
            border: 1px solid green;
        }
        #content {
        }
        #ad {
        }
    </style>
</head>

<body>
<h1>观察者模式</h1>
<select name="">
    <option value="male">男式风格</option>
    <option value="female">女式风格</option>
</select>
<input type="button"  value="观察尾部" />
<input type="button"  value="别观察尾部了" />
<div>我是内容</div>
<div>我是广告</div>
<div>学习</div>


<script>
    // 服务器端
    var sel = document.getElementsByTagName('select')[0];
    sel.observers = {};

    sel.attach = function(key, obj) {
        sel.observers[key] = obj;
    }
    sel.detach = function(key) {
        delete this.observers[key];
    }
    sel.onchange = sel.notify = function(){
        for(var key in this.observers) {
            this.observers[key].update(this);
        }
    }

    // 客户端
        var content = document.getElementById('content');
    content.update = function(observer) {
        if(observer.value == 'male'){
            this.style.backgroundColor = 'gray';
        } else if(observer.value=='female'){
            this.style.backgroundColor = 'pink';
        }
    }
    sel.attach('content', content);

    var ad = document.getElementById('ad');
    ad.update = function(observer) {
        if(observer.value == 'male'){
            this.innerHTML = '汽车';
        } else if(observer.value=='female'){
            this.innerHTML = '减肥';
        }
    }
    sel.attach('ad', ad);

    // 客户端和服务端实现了解耦
    // 后面有一个学习区, 如果状态改变了, 学习区也要变化

    var study = document.getElementById('study');
    study.update = function(observer) {
        if(observer.value == 'male'){
            this.innerHTML = '学习计算机';
        } else if(observer.value=='female'){
            this.innerHTML = '学习美容';
        }
    }
    sel.attach('study', study);


    //如果想不观察尾部了
    function t1() {
        sel.atach('study', study);
    }
    function t2() {
        sel.detach('study');
    }
</script>
</body>
</html>
로그인 후 복사
.html
<!DOCTYPE HTML>
<html>

<head>
    <title>colour_blue</title>
    <meta name="description" c />
    <meta name="keywords" c />
    <meta http-equiv="content-type" c />
    <style>
        div{
            margin:10px;
            width:500px;
            height:200px;
            border: 1px solid green;
        }
        #content {
        }
        #ad {
        }
    </style>
</head>

<body>
<h2>责任链模式举报过程</h2>
<form action="10.php" method="post">
    <select name="jubao">
        <option value="1">粗口</option>
        <option value="2">黄赌毒</option>
        <option value="3">分裂国家</option>
    </select>
    <button type="submit">举报</button>
</form>

</body>
</html>

.php
<?php
header('Content-type: text/html; charset=utf-8');

//版主
class board {
    protected $power = 1;
    protected $top = 'admin';

    public function process($lev) {
        if($lev <= $this->power) {
            echo '版主删贴';
        } else {
            $top = new $this->top;
            $top->process($lev);
        }
    }
}

class admin {
    protected $power = 2;
    protected $top = 'police';

    public function process($lev) {
        if($lev <= $this->power) {
            echo '管理员封账号';
        } else {
            $top = new $this->top;
            $top->process($lev);
        }
    }
}

class police {
    protected $power;
    protected $top = null;
    public function process($lev) {
        echo '抓起来';
    }
}


$lev = $_POST['jubao']+0;
$judge = new board();
$judge->process($lev);
로그인 후 복사
.html
<!DOCTYPE HTML>
<html>

<head>
    <title>colour_blue</title>
    <meta name="description" c />
    <meta name="keywords" c />
    <meta http-equiv="content-type" c />
    <style>
        div{
            margin:10px;
            width:500px;
            height:200px;
            border: 1px solid green;
        }
        #content {
        }
        #ad {
        }
    </style>
</head>

<body>
<h2>面向过程完成举报过程</h2>
<form action="09.php" method="post">
    <select name="jubao">
        <option value="1">粗口</option>
        <option value="2">黄赌毒</option>
        <option value="3">分裂国家</option>
    </select>
    <button type="submit">举报</button>
</form>

</body>
</html>

.php
<?php
header('Content-type: text/html; charset=utf-8');
$lev = $_POST['jubao'];

//版主
class board {
    public function process() {
        echo '版主删贴';
    }
}

class admin {
    public function process() {
        echo '管理员封账号';
    }
}

class police {
    public function process() {
        echo '抓起来';
    }
}

if ($lev == 1) {
    $judge = new board();
    $judge->process();
} elseif($lev==2) {
    $judge = new admin();
    $judge->process();
} elseif($lev==3) {
    $judge = new police();
    $judge->process();
}

// 处理的不够优雅, 现在还是面向过程的写法, 面向过程和面向对象混合了
// 如果以后在两个等级中间要添加一个等级应该怎么办
로그인 후 복사
.html
<!DOCTYPE HTML>
<html>

<head>
    <title>colour_blue</title>
    <meta name="description" c />
    <meta name="keywords" c />
    <meta http-equiv="content-type" c />
    <style>
        div{
            margin:10px;
            width:500px;
            height:200px;
            border: 1px solid green;
        }
        #content {
        }
        #ad {
        }
    </style>
</head>

<body>
<h2>策略模式 和工厂方法的区别只是在逻辑上的区别, 也叫聚合</h2>
<form action="11.php" method="post">

    <input type="text" name="op1" />
    <select name="op">
        <option value="add">+</option>
        <option value="sub">-</option>
        <option value="mul">*</option>
        <option value="div">/</option>
    </select>
    <input type="text" name="op2" />
    <button type="submit">计算</button>
</form>

</body>
</html>

.php
<?php
/**
 * Created by PhpStorm.
 * User: michaeldu
 * Date: 15/7/15
 * Time: 上午12:11
 */

interface Math {
    public function calc($op1, $op2);
}

class MathAdd implements Math{

    public function calc($op1, $op2)
    {
        return $op1 + $op2;
    }
}
class MathSub implements Math{

    public function calc($op1, $op2)
    {
        return $op1 - $op2;
    }
}
class MathMul implements Math{

    public function calc($op1, $op2)
    {
        return $op1 * $op2;
    }
}
class MathDiv implements Math{

    public function calc($op1, $op2)
    {
        return $op1 / $op2;
    }
}

//封装一个虚拟计算器, 统一计算接口

class CMath {
    protected $calc = null;

    public function __construct($type) {
        $calc = 'Math'. ucfirst($type);
        $this->calc = new $calc();
    }

    public function calc($op1, $op2) {
        return $this->calc->calc($op1, $op2);
    }
}

$type = $_POST['op'];
$cmath = new CMath($type);
echo $cmath->calc($_POST['op1'], $_POST['op2']);
로그인 후 복사
// 装饰器模式 decorator

class article {
    protected $content;

    public function __construct($content)
    {
        $this->content = $content;
    }

    public function decorator() {
        return $this->content;
    }
}

$art = new article("好好学习");
echo $art->decorator();

// 文章需要小编加摘要

class BianArticle extends article {
    public function summary() {
        return $this->content.'小编加了摘要';
    }
}

$art = new BianArticle('好好学习');
echo $art->summary();

// 又请了SEO人员, 要对文章进行description处理...
class SEOArticle extends BianArticle {
    public function seo() {
        //...
    }
}

// 又有了广告部
class ADArticle extends  SEOArticle {
    // 层次越来越深, 目的却只是给文章加各种内容
}
로그인 후 복사
// 装饰器模式做文章修饰功能

class BaseArt {
    protected $content;
    protected $art;

    public function __construct($content) {
        $this->content = $content;
    }

    public function decorator() {
        return $this->content;
    }
}

//编辑文章摘要

class BianArt extends BaseArt {
    public function __construct(BaseArt $art) {
        $this->art = $art;
    }
    public function decorator() {
        return $this->content = $this->art->decorator() . '小编摘要';
    }
}

// SEO
class SEOArt Extends BaseArt {
    public function __construct(BaseArt $art) {
        $this->art = $art;
    }
    public function decorator() {
        return $this->content = $this->art->decorator() . 'SEO关键词';
    }
}

$b = new SEOArt(new BianArt(new BaseArt('天天向上')));
echo $b->decorator();

$b = new BianArt(new SEOArt(new BaseArt('天天向上')));
echo $b->decorator();

// 装饰的先后顺序可以随便换, 新增多少个装饰者都很方便

// 基类负责创建对象
// 子类负责装饰
로그인 후 복사
// 适配器模式

// 服务器端代码
class weather {
    public static function show() {
        $today = [
            'tep' => 28,
            'wind' => 7,
            'sun' => 'sunny',
        ];
        return serialize($today);
    }
}

// 客户端调用

$weather = unserialize(weather::show());
echo '温度: ',$weather['tep'],'<br />';
echo '风力: ',$weather['wind'],'<br />';
echo 'sun: ',$weather['sun'],'<br />';

// 来了一批手机上的java客户端 , 不认识PHP的串化行后的字符串, 怎么办?
// 把服务器端代码改了? 旧的客户端会受影响

// 旧的类和函数都不让修改, 如何来进行扩展

// 增加一个适配器
class AdapterWeather extends weather {
    public static function show() {
        //拿到旧数据
        $today = parent::show();
        // 然后开始转换
        $today = unserialize($today);
        $today = json_encode($today);
        return $today;
    }
}

// ==== java, python再来调用就不怕了, 通过适配器调用

$weather = AdapterWeather::show();
$w = json_decode($weather);
echo '温度: ',$w->tep,'<br />';
echo '风力: ',$w->wind,'<br />';
echo 'sun: ',$w->sun,'<br />';

// 没有修改旧的方法, 这样就没有影响旧的客户端
// 没有修改旧的类, 说明没有违反开闭原则
로그인 후 복사
// 桥接模式 bridge 尝试

// 论坛给用户发信息, 可以是站内短信, email, 手机

// 本来只需要发站内短信, 后来又需要发email
// 一个类只做一件事, 我们把他做成一个接口或者抽象类, 具体的发送由具体的子类实现

interface msg {
    public function send($to, $content);
}

class zn implements msg {

    public function send($to, $content)
    {
        echo '站内信给', $to, ' 内容是: ', $content;
    }
}

// 有一天要改造, 要发email
class email implements msg {

    public function send($to, $content)
    {
        echo 'email给', $to, ' 内容是: ', $content;
    }
}

// 后来要发短信
class sms implements msg {

    public function send($to, $content)
    {
        echo '短信给', $to, ' 内容是: ', $content;
    }
}

// 后来内容也丰富了, 分普通, 加急, 特急
// 子类就爆炸了, 像数据的三范式一样, 如果完全遵循解耦是不行了
/*
class zncommon extends zn;
class znwarn extends zn;
class zndanger extends zn;

class emailcomm extends email;
class emailwarn extends email;
class emaildanger extends email;
....
*/

/**
 * 思考:
 * 信的发送方式是一个变化因素
 * 信的紧急程度是一个变化因素,
 * 为了不修改父类, 只好考虑2个因素的组织, 不停产生新类....
 */
로그인 후 복사
abstract class info {
    protected $send = null;

    public function __construct($send) {
        $this->send = $send;
    }

    abstract public function msg($content);
    public function send($to, $content){
        $content = $this->msg($content);
        $this->send->send($to, $content);
    }
}

class zn {
    public function send($to, $content) {
        echo '站内给: ', $to, '内容是: ', $content;
    }
}

class email {
    public function send($to, $content) {
        echo 'email给: ', $to, '内容是: ', $content;
    }
}

class sms {
    public function send($to, $content) {
        echo 'sms给: ', $to, '内容是: ', $content;
    }
}

class commoninfo extends info{
    public function msg($content) {
        return '普通'. $content;
    }
}

class warninfo  extends info{
    public function msg($content) {
        return '紧急'.$content;
    }
}

class dangerinfo  extends info{
    public function msg($content) {
        return '紧急'.$content;
    }
}

// 用站内发普通信息
$commoninfo = new commoninfo(new zn());
$commoninfo->send('小明', '吃饭了');

//给小刚发紧急手机短信消息
$dangerinfo = new dangerinfo(new sms());
$dangerinfo->send('小刚', '失火了');

// 本来需要3x3个类
// 现在只需要3+3个类了
// 现在耦合了, view中不写逻辑, 数据库三范式, 老有相同的字段, 为了速度, 之前的设计模式都是在解耦, 现在反而增加了耦合, 是为了防止子类爆炸
로그인 후 복사

위에서는 내용을 포함하여 싱글톤, 팩토리, 관찰자, 책임 체인, 장식, 전략, 적응 및 브리지 모드의 일반적인 PHP 디자인 패턴을 소개했습니다. PHP 튜토리얼에 관심이 있는 친구들에게 도움이 되기를 바랍니다.

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

핫 AI 도구

Undresser.AI Undress

Undresser.AI Undress

사실적인 누드 사진을 만들기 위한 AI 기반 앱

AI Clothes Remover

AI Clothes Remover

사진에서 옷을 제거하는 온라인 AI 도구입니다.

Undress AI Tool

Undress AI Tool

무료로 이미지를 벗다

Clothoff.io

Clothoff.io

AI 옷 제거제

AI Hentai Generator

AI Hentai Generator

AI Hentai를 무료로 생성하십시오.

인기 기사

R.E.P.O. 에너지 결정과 그들이하는 일 (노란색 크리스탈)
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 최고의 그래픽 설정
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
R.E.P.O. 아무도들을 수없는 경우 오디오를 수정하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌
WWE 2K25 : Myrise에서 모든 것을 잠금 해제하는 방법
3 몇 주 전 By 尊渡假赌尊渡假赌尊渡假赌

뜨거운 도구

메모장++7.3.1

메모장++7.3.1

사용하기 쉬운 무료 코드 편집기

SublimeText3 중국어 버전

SublimeText3 중국어 버전

중국어 버전, 사용하기 매우 쉽습니다.

스튜디오 13.0.1 보내기

스튜디오 13.0.1 보내기

강력한 PHP 통합 개발 환경

드림위버 CS6

드림위버 CS6

시각적 웹 개발 도구

SublimeText3 Mac 버전

SublimeText3 Mac 버전

신 수준의 코드 편집 소프트웨어(SublimeText3)

화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? 화웨이 GT3 Pro와 GT4의 차이점은 무엇입니까? Dec 29, 2023 pm 02:27 PM

많은 사용자들이 스마트 시계를 선택할 때 Huawei 브랜드를 선택하게 됩니다. 그 중 Huawei GT3pro와 GT4가 가장 인기 있는 선택입니다. 두 제품의 차이점을 궁금해하는 사용자가 많습니다. Huawei GT3pro와 GT4의 차이점은 무엇입니까? 1. 외관 GT4: 46mm와 41mm, 재질은 유리 거울 + 스테인레스 스틸 본체 + 고해상도 섬유 후면 쉘입니다. GT3pro: 46.6mm 및 42.9mm, 재질은 사파이어 유리 + 티타늄 본체/세라믹 본체 + 세라믹 백 쉘입니다. 2. 건강한 GT4: 최신 Huawei Truseen5.5+ 알고리즘을 사용하면 결과가 더 정확해집니다. GT3pro: ECG 심전도, 혈관 및 안전성 추가

기능은 무슨 뜻인가요? 기능은 무슨 뜻인가요? Aug 04, 2023 am 10:33 AM

함수는 특정 기능을 포함하는 재사용 가능한 코드 블록으로, 입력 매개변수를 받아들이고 특정 작업을 수행하며 결과를 반환하는 것이 목적입니다. 코드 재사용성과 유지 관리성을 향상시키는 코드입니다.

수정: Windows 11에서 캡처 도구가 작동하지 않음 수정: Windows 11에서 캡처 도구가 작동하지 않음 Aug 24, 2023 am 09:48 AM

Windows 11에서 캡처 도구가 작동하지 않는 이유 문제의 근본 원인을 이해하면 올바른 솔루션을 찾는 데 도움이 될 수 있습니다. 캡처 도구가 제대로 작동하지 않는 주요 이유는 다음과 같습니다. 초점 도우미가 켜져 있습니다. 이렇게 하면 캡처 도구가 열리지 않습니다. 손상된 응용 프로그램: 캡처 도구가 실행 시 충돌하는 경우 응용 프로그램이 손상되었을 수 있습니다. 오래된 그래픽 드라이버: 호환되지 않는 드라이버가 캡처 도구를 방해할 수 있습니다. 다른 응용 프로그램의 간섭: 실행 중인 다른 응용 프로그램이 캡처 도구와 충돌할 수 있습니다. 인증서가 만료되었습니다. 업그레이드 프로세스 중 오류로 인해 이 문제가 발생할 수 있습니다. 이 문제는 대부분의 사용자에게 적합하며 특별한 기술 지식이 필요하지 않습니다. 1. Windows 및 Microsoft Store 앱 업데이트

iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? Mar 01, 2024 pm 12:55 PM

매년 Apple이 iOS 및 macOS의 새로운 주요 버전을 출시하기 전에 사용자는 몇 달 전에 베타 버전을 다운로드하여 먼저 경험할 수 있습니다. 소프트웨어는 대중과 개발자 모두가 사용하기 때문에 Apple은 개발자 베타 버전의 공개 베타 버전인 개발자 버전과 공개 버전을 모두 출시했습니다. iOS 개발자 버전과 공개 버전의 차이점은 무엇인가요? 말 그대로 개발자 버전은 개발자 베타 버전이고, 퍼블릭 버전은 퍼블릭 베타 버전이다. 개발자 버전과 공개 버전은 서로 다른 대상을 대상으로 합니다. 개발자 버전은 개발자가 테스트하기 위해 Apple에서 사용합니다. 다운로드하고 업그레이드하려면 Apple 개발자 계정이 필요합니다.

iPhone에서 App Store 오류에 연결할 수 없는 문제를 해결하는 방법 iPhone에서 App Store 오류에 연결할 수 없는 문제를 해결하는 방법 Jul 29, 2023 am 08:22 AM

1부: 초기 문제 해결 단계 Apple 시스템 상태 확인: 복잡한 솔루션을 살펴보기 전에 기본 사항부터 시작해 보겠습니다. 문제는 귀하의 기기에 있는 것이 아닐 수도 있습니다. Apple 서버가 다운되었을 수도 있습니다. Apple의 시스템 상태 페이지를 방문하여 AppStore가 제대로 작동하는지 확인하세요. 문제가 있는 경우 Apple이 문제를 해결하기를 기다리는 것뿐입니다. 인터넷 연결 확인: "AppStore에 연결할 수 없음" 문제는 때때로 연결 불량으로 인해 발생할 수 있으므로 인터넷 연결이 안정적인지 확인하십시오. Wi-Fi와 모바일 데이터 간을 전환하거나 네트워크 설정을 재설정해 보세요(일반 > 재설정 > 네트워크 설정 재설정 > 설정). iOS 버전을 업데이트하세요.

php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 php提交表单通过后,弹出的对话框怎样在当前页弹出,该如何解决 Jun 13, 2016 am 10:23 AM

php提交表单通过后,弹出的对话框怎样在当前页弹出php提交表单通过后,弹出的对话框怎样在当前页弹出而不是在空白页弹出?想实现这样的效果:而不是空白页弹出:------解决方案--------------------如果你的验证用PHP在后端,那么就用Ajax;仅供参考:HTML code

Python에서 'enumerate()' 함수의 목적은 무엇입니까? Python에서 'enumerate()' 함수의 목적은 무엇입니까? Sep 01, 2023 am 11:29 AM

이번 글에서는 enumerate() 함수와 Python에서 “enumerate()” 함수의 목적에 대해 알아봅니다. enumerate() 함수란 무엇입니까? Python의 enumerate() 함수는 데이터 컬렉션을 매개변수로 받아들이고 열거형 객체를 반환합니다. 열거형 객체는 키-값 쌍으로 반환됩니다. 키는 각 항목에 해당하는 인덱스이고 값은 항목입니다. 구문 enumerate(iterable,start) 매개변수 iterable - 전달된 데이터 컬렉션은 iterablestart라는 열거형 개체로 반환될 수 있습니다. - 이름에서 알 수 있듯이 열거형 개체의 시작 인덱스는 start로 정의됩니다. 우리가 무시한다면

MySQL.proc 테이블의 역할과 기능에 대한 자세한 설명 MySQL.proc 테이블의 역할과 기능에 대한 자세한 설명 Mar 16, 2024 am 09:03 AM

MySQL.proc 테이블의 역할과 기능에 대한 자세한 설명 MySQL은 널리 사용되는 관계형 데이터베이스 관리 시스템으로, 개발자가 MySQL을 사용할 때 저장 프로시저(StoredProcedure)를 생성하고 관리하는 경우가 많습니다. MySQL.proc 테이블은 저장 프로시저의 이름, 정의, 매개변수 등을 포함하여 데이터베이스의 모든 저장 프로시저와 관련된 정보를 저장하는 매우 중요한 시스템 테이블입니다. 이번 글에서는 MySQL.proc 테이블의 역할과 기능에 대해 자세히 설명하겠습니다.

See all articles