찾다
백엔드 개발PHP 튜토리얼七. PHP模式设计执行及描述任务

1. 解析器模式//解析器内容类//用于存放表达式的运算结果,并且能根据传入的表达式返回当初记录的结果class InterpreterContext{    private $expressionstore=array();    //将对象放进array里面,索引号是对象ID号    function replace(Expression $exp,$value){        $this->expressionstore[$exp->getKey()]=$value;    }    function lookup(Expression $exp){        return $this->expressionstore[$exp->getKey()];    }}abstract class Expression{    private static $keyCount=0;    private $key;    abstract function interpret(InterpreterContext $context);    //每一个对象都有一个唯一的key    function getKey(){        if(!isset($this->key)){            $this->key=++self::$keyCount;        }        return $this->key;    }}//字符串class LiteralExpression extends Expression{    private $value;    function __construct($value){        $this->value=$value;    }    function interpret(InterpreterContext $context){        $context->replace($this, $this->value);    }}//变量class VariableExpression extends Expression{    private $value;    private $name;    function __construct($name,$value=null){        $this->name=$name;        $this->value=$value;    }    function setValue($value){        $this->value=$value;    }    function getKey(){        return $this->name;    }    function interpret(InterpreterContext $context){        if(!is_null($this->value)){            $context->replace($this, $this->value);            //设置为空,可以避免在没有修改value的情况下再次调用该方法的时候,            //也第二次调用了InterpreterContext::replece            $this->value=null;        }    }}//操作符表达式 抽象基类abstract class OperatorExpression extends Expression{    //左右操作数    protected $l_op;    protected $r_op;    function __construct(Expression $l_op,Expression $r_op){        $this->l_op=$l_op;        $this->r_op=$r_op;    }    function interpret(InterpreterContext $context){        $this->l_op->interpret($context);        $this->r_op->interpret($context);        $result_l=$context->lookup($this->l_op);        $result_r=$context->lookup($this->r_op);        $this->doInterpret($context, $result_l, $result_r);    }    protected abstract function doInterpret(InterpreterContext $context,$result_l,$result_r);}//相等表达式class EqualsExpression extends OperatorExpression{    //计算后将结果保存进this里...    protected function doInterpret(InterpreterContext $context,$result_l,$result_r){        $context->replace($this, $result_l==$result_r);    }}//布尔或表达式class BooleanOrExpression extends OperatorExpression{    protected function doInterpret(InterpreterContext $context, $result_l, $result_r){        $context->replace($this, $result_l || $result_r);    }}//布尔与表达式class BooleanAndExpression extends OperatorExpression{    protected function doInterpret(InterpreterContext $context, $result_l, $result_r){        $context->replace($this, $result_l && $result_r);    }}/*$context=new InterpreterContext();$literal=new LiteralExpression("Bob");$literal->interpret($context);print $context->lookup($literal);//Bob$context=new InterpreterContext();$myvar=new VariableExpression("V","one");$myvar->interpret($context);print $context->lookup($myvar);//one$myothervar=new VariableExpression("V");$myvar->interpret($context);print $context->lookup($myvar);//one*///利用上面的代码来检测迷你型语言//$input equals "4" or $input equals "four"$context=new InterpreterContext();//一个没有赋值的变量$input=new VariableExpression('input');//定义一个复杂的布尔型变量,初始化的参数被保存在l_op,r_op里面//注意,此时他们还没有进行相关运算,必须等到调用布尔型变量的interpret()//之后,布尔型变量里面的参数才会各自调用自身的interpret,形成一个调用栈...$statement=new BooleanOrExpression(        new EqualsExpression($input, new LiteralExpression('four')),         new EqualsExpression($input, new LiteralExpression('4')));$statement->interpret($context);print $context->lookup($statement);foreach (array('four','4','52') as $val){    $input->setValue($val);    print "$val:\n";    $statement->interpret($context);    if($context->lookup($statement)){        print "top marks\n";    }else{        print "dunce hat on\n\n";    }}/*four:top marks4:top marks52:dunce hat on*/  2.策略模式      将类中许多不同操作而且是来自同一个接口的算法,独立起来封装在一个新类中,主类在由分类组合或者聚合而成//Question类将由Marker聚合而成abstract class Question{    protected $prompt;    protected $marker;    function __construct($prompt,Marker $marker){        $this->marker=$marker;        $this->prompt=$prompt;    }    //利用委托实现    function mark($response){        return $this->marker->mark($response);    }}class TextQuestion extends Question{    //处理文本问题特有的操作}class AVQuestion extends Question{    //处理语音问题特有操作}//策略对象//将算法部分独立出来封装在Marker类中....abstract class Marker{    protected $test;    function __construct($test){        $this->test=$test;    }    abstract function mark($response);}//MarkLogic语言class MarkLogicMarker extends Marker{    protected $engine;    function __construct($test){        parent::__construct($test);    }    function mark($response){        //模拟返回true        return true;    }}//直接匹配class MatchMarker extends Marker{    function mark($response){        return ($this->test==$response);    }}//正则表达式class RegexpMarker extends Marker{    function mark($response){        return (preg_match($this->test, $response));    }}//客户端示例代码$markers=array(new RegexpMarker("/f.ve/"),        new MatchMarker("fivev"),        new MarkLogicMarker('$input equals "five"'));foreach($markers as $marker){    print get_class($marker)."\n";    //新建一个问题,将marker实例传进去    $question=new TextQuestion("How many beans make five", $marker);    foreach (array("five","four") as $response){        print "\t response:$response: ";        if($question->mark($response)){            print "well done\n";        }else{            print "never mind\n";        }    }}/*RegexpMarker     response:five: well done     response:four: never mindMatchMarker     response:five: never mind     response:four: never mindMarkLogicMarker     response:five: well done     response:four: well done*/3 观察者模式     观察者模式的和兴是把客户元素(观察者)从一个中心类中分离开来.当主体中有事件发生时,观察者必须被通知到!同时观察者和主体类不是通过硬编码实现,而是通过接口组合聚合实现*问题// Login类(主体类)class Login {    const LOGIN_USER_UNKNOWN = 1;    const LOGIN_WRONG_PASS = 2;    const LOGIN_ACCESS = 3;    private $status = array ();    // 登录操    function handleLogin($user, $pass, $ip) {        $ret=false;        switch (rand ( 1, 3 )) {            case 1 :                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );                $ret=ture;                break;            case 2 :                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );                $ret=false;                break;            case 3 :                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );                $ret=false;                break;            default:                $ret=false;        }        //如果需要记录IP时        Logger::logIP($user, $ip, $this->getStatus());        //如果需要把登录失败的人的IP发送到管理员邮箱时...        if(!$ret){            Notifier::mailWarning($user, $ip, $this->getStatus());        }        //还需要其他功能时,比如特殊IP需要设置cookie等...        //需要在这里面一直添加...        return $ret;    }    function setStatus($status, $user, $ip) {        $this->status = array ($status,$user,$ip);    }    function getStatus(){        return $this->status;    }}class Logger{    static function logIP($user,$ip,$status){}}class Notifier{    static function mailWarning($user,$ip,$status){}}*利用观察者模式,使代码改动少些....// 主体类的抽象接口interface Observable{    //附加    function attach(Observer $observer);    //删除    function detach(Observer $observer);    //通知    function notify();}// Login类(主体类)class Login implements Observable{    const LOGIN_USER_UNKNOWN = 1;    const LOGIN_WRONG_PASS = 2;    const LOGIN_ACCESS = 3;    private $observers;    private $status = array ();    // 登录操作    function handleLogin($user, $pass, $ip) {        $ret=false;        switch (rand ( 1, 3 )) {            case 1 :                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );                $ret=ture;                break;            case 2 :                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );                $ret=false;                break;            case 3 :                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );                $ret=false;                break;            default:                $ret=false;        }        //使用观察者模式之后,如果需要增加新功能,只需要在本类中添加观察者实例即可...        $this->notify();        return $ret;    }    function setStatus($status, $user, $ip) {        $this->status = array ($status,$user,$ip);    }    function getStatus(){        return $this->status;    }    function attach(Observer $observer){        $this->observers[]=$observer;    }    function detach(Observer $observer){        $newObserver=array();        foreach ($this->observers as $obs){            if($obs!==$observer){                $newObserver[]=$obs;            }        }        $this->observers=$newObserver;    }    //通知所有观察者    function notify(){        foreach ($this->observers as $bos){            $bos->update($this);        }    }}//观察者接口interface Observer{    function update(Observable $observable);}class SecurityMonitor implements Observer{    function update(Observable $observable){        //getStatus()不是Observable接口规定的方法        $status=$observable->getStatus();        //对status的判断也涉及到耦合问题        if($status[0]==Login::LOGIN_WRONG_PASS){            //发送邮件给管理员            print __CLASS__.":\t sending mail to sysadmin\n";        }    }}$login=new Login();$login->attach(new SecurityMonitor());$login->handleLogin("coco", "123456", "127.0.0.1");//有可能输出发送消息到管理员 *改进后的观察者模式//可观察元素:主体类的基接口interface Observable{    //附加    function attach(Observer $observer);    //删除    function detach(Observer $observer);    //通知    function notify();}// Login类(主体类)class Login implements Observable{    const LOGIN_USER_UNKNOWN = 1;    const LOGIN_WRONG_PASS = 2;    const LOGIN_ACCESS = 3;    private $observers;    private $status = array ();    // 登录操作    function handleLogin($user, $pass, $ip) {        $ret=false;        switch (rand ( 1, 3 )) {            case 1 :                $this->setStatus ( self::LOGIN_ACCESS, $user, $ip );                $ret=ture;                break;            case 2 :                $this->setStatus ( self::LOGIN_WRONG_PASS, $user, $ip );                $ret=false;                break;            case 3 :                $this->setStatus ( self::LOGIN_USER_UNKNOWN, $user, $ip );                $ret=false;                break;            default:                $ret=false;        }        //使用观察者模式之后,如果需要增加新功能,只需要在本类中添加观察者实例即可...        $this->notify();        return $ret;    }    function setStatus($status, $user, $ip) {        $this->status = array ($status,$user,$ip);    }    function getStatus(){        return $this->status;    }    function attach(Observer $observer){        $this->observers[]=$observer;    }    function detach(Observer $observer){        $newObserver=array();        foreach ($this->observers as $obs){            if($obs!==$observer){                $newObserver[]=$obs;            }        }        $this->observers=$newObserver;    }    //通知所有观察者    function notify(){        foreach ($this->observers as $bos){            $bos->update($this);        }    }}//观察者接口interface Observer{    function update(Observable $observable);}//Login:观察者超类(用于解决直接在Observer中调用具体的Observable子类造成的风险)abstract class LoginObserver implements Observer{    private $login;    function __construct(Login $login){        $this->login=$login;        $this->login->attach($this);    }    //该方法在Observable的子类某些方法被调用时触发    function update(Observable $observable){        //触发该方法时,传入的参数必须是Login才有效...        if($this->login===$observable){             $this->doUpdate($observable);        }    }    abstract function doUpdate(Login $login);    }//改进后的观察者能保证调用的Observable实例方法一定存在class SecurityMonitor extends LoginObserver{    function doUpdate(Login $login){        $status=$login->getStatus();        //对status的判断也涉及到耦合问题        if($status[0]==Login::LOGIN_WRONG_PASS){            //发送邮件给管理员            print __CLASS__.":\t sending mail to sysadmin\n";        }    }}//日常记录class GeneralLogger extends LoginObserver{    function doUpdate(Login $login){        $status=$login->getStatus();        //添加记录到log中        //...        print __CLASS__."\t add login data to log\n";    }}//合作伙伴工具类class PartnershipTool extends LoginObserver{    function doUpdate(Login $login){        $status=$login->getStatus();        //检查IP,如果匹配,则设置cookie...        //...        print __CLASS__."\t set cookie if IP matches a list\n";    }}//客户端代码有一点点改变...$login=new Login();new SecurityMonitor($login);new GeneralLogger($login);new PartnershipTool($login);$login->handleLogin("coco", "123456", "127.0.0.1");/* * 有可能输出 *SecurityMonitor:     sending mail to sysadmin *GeneralLogger     add login data to log *PartnershipTool    set cookie if IP matches a list **/4. 访问者模式       当使用对象集合时,我们可能需要对结构上每一个单独的组件应用各种操作.这样的操作可以内建于组件本身,毕竟组件内部调用其他组件是最方便的.        但是这种方法也存在问题,因为我们并不知道所有可能需要的执行的操作.如果每增加一个操作,就在类中增加一个对于新操作的支持,类就会变得越来越臃肿.访问者模式可以解决这个问题.//本例是基于"文明"游戏的代码建立而成...//*战斗单元类abstract class Unit{    //深度    protected $depth=0;    //攻击强度    abstract function bombardStrength();    function getComposite(){        return null;    }    //为访问者模式打造的方法    function accept(ArmyVisitor $visitor){        //构建一个根据自己规则定义的方法名,然后交给visitor自身调用        $method="visit".get_class($this);        $visitor->$method($this);    }    //用于计算Unit在对象树中的深度    protected function setDepth($depth){        $this->depth==$depth;    }    function getDepth(){        return $this->depth;    }}//复合抽象类abstract class CompositeUnit extends Unit{    protected $units=array();    //为访问者模式打造的方法    function accept(ArmyVisitor $visitor){        //构建一个根据自己规则定义的方法名,然后交给visitor自身调用        //先调用父类accept(),再遍历调用子元素accept()        parent::accept($visitor);        foreach ($this->units as $thisunit){            $thisunit->accept($visitor);        }    }    //可以不用写bombardStrength()    function getComposite(){        return $this;    }    //添加单元    //同时标记节点在对象树中的深度    function addUnit(Unit $unit){        if(!empty($unit)){            if(in_array($unit, $this->units,true)){                return;            }            //可以用下面代码替换in_array()函数//             foreach ($this->units as $thisunit){//                 if($thisunit===$unit){//                     return;//                 }//             }            //计算好深度先...            $unit->setDepth($this->depth+1);            array_push($this->units, $unit);        }    }    function removeUnit(Unit $unit){        $this->units=array_udiff($this->units, array($unit), function ($a,$b){return ($a===$b?0:1);});    }    }//射手class Archer extends Unit{    function bombardStrength(){        return 4;    }}//激光塔class LaserCannonUnit extends Unit{    function bombardStrength(){        return 44;    }}//军队:由战斗单元组成class Army extends CompositeUnit{    //计算总强度    function bombardStrength(){        $ret=0;        foreach ($this->units as $unit){            $ret+=$unit->bombardStrength();        }        return $ret;    }    //移动能力,防御能力...省略}//运兵船:一个类似军队的单元,它具备10个战斗单元,有攻击力class TroopCarrier extends CompositeUnit{    //具备和军队差不多的方法和属性    function bombardStrength(){        //Do something...    }}//军队访问者基类abstract class ArmyVisitor{    //相关方法待会写...    //Army可能有多少种Unit,这里就有多少个visit方法...    //方法命名规则为visit+类名    //默认的visit    abstract function visit(Unit $unit);    function visitArcher(Archer $node){        $this->visit($node);    }    function visitLaserCannonUnit(LaserCannonUnit $node){        $this->visit($node);    }    function visitArmy(Army $node){        $this->visit($node);    }    function visitTroopCarrier(TroopCarrier $node){        $this->visit($node);    }}//具体的Army访问者类,用于转存文本class TextDumpArmyVisitor extends ArmyVisitor{    private $text="";    function visit(Unit $node){        $ret="";        $pad=4*$node->getDepth();        $ret.=sprintf("%{$pad}s","");        $ret.=get_class($node).":";        $ret.="bombard: ".$node->bombardStrength()."\n";        $this->text.=$ret;    }    function getText(){        return $this->text;    }}//客户端实例代码$army=new Army();$army->addUnit(new Archer());$army->addUnit(new LaserCannonUnit());$textdump=new TextDumpArmyVisitor();$army->accept($textdump);print $textdump->getText();/*   *  Army:bombard: 48 *  Archer:bombard: 4 *  LaserCannonUnit:bombard: 44 */5. 命令模式//命令模式//命令模式最初来源于图形化用户界面设计,但现在广泛应用于企业应用设计,特别促进了控制器(请求和分法处理)//和领域模型(应用逻辑)的分离.说得更简单一点,命令模式有助于系统更好地进行组织,并易于扩展//Command可以设计成接口,因为它很简单...//Commands/Command.phpabstract class Command{    abstract function execute(CommandContext $context);}  require_once("Command.php");class Registry{    //一个空类...    static function getAccessManager(){        return new AccessManager();    }}class AccessManager{    function login(){        return new stdClass();    }    function getError(){}}class LoginCommand extends Command{    function execute(CommandContext $context){        $manager=Registry::getAccessManager();        $user=$context->get('username');        $user=$context->get('pass');        //虚构出来的空类空方法        $user_obj=$manager->login();        if(is_null($user_obj)){            $context->setError($manager->getError());            return false;        }        $context->addParam("user", $user);        return true;    }}  //CommandContext类用来做任务扩增用,在这儿主要功能是传递数据给Command类class CommandContext{    private $params=array();    private $error="";    function __construct(){        $this->params=$_REQUEST;    }    function addParam($key,$val){        $this->params[$key]=$val;    }    function get($key){        return $this->params[$key];    }    function setError($error){        $this->error=$error;    }    function getError(){        return $this->error;    }}//客户端代码(用于创建命令)已经调用者代码class CommandNotFoundException extends Exception{    }//创建命令的工厂class CommandFactory{    private static $dir="Commands";    //根据参数action,以及类文件存放目录$dir动态创建相应的$action+Command类    static function getCommand($action='default'){        //匹配是否出现非法字符(非字母数字下划线)        if(preg_match('/\W/', $action)){            throw new Exception("Illegal characters in action");        }        $class=ucfirst(strtolower($action)."Command");        $file=self::$dir.DIRECTORY_SEPARATOR."{$class}.php";        if(!file_exists($file)){            throw new CommandNotFoundException("File could not be find !");        }        require_once("$file");        if(!class_exists($class)){            throw new CommandNotFoundException("Class could not be find !");        }        return new $class();    }}//调用者,里面包含一个CommandContext对象实例,用于存放web请求的数据class Controller{    private $context;    function __construct(){        $this->context=new CommandContext();    }    function getContext(){        return $this->context;    }    function process(){        $cmd=CommandFactory::getCommand($this->getContext()->get('action'));        if(!$cmd->execute($this->context)){            //处理失败            print "Faile in process!";        }else{            //处理成功,可以显示相应的视图层            print "Success in process!";        }    }}$controller=new Controller();$context=$controller->getContext();$context->addParam('action', 'Login');$context->addParam('user', 'cocos');$context->addParam('pass', 'tiddles');//controller执行process方法,需要不理解command的意义.$controller->process();//Success in process


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

PHP는 주로 절차 적 프로그래밍이지만 객체 지향 프로그래밍 (OOP)도 지원합니다. Python은 OOP, 기능 및 절차 프로그래밍을 포함한 다양한 패러다임을 지원합니다. PHP는 웹 개발에 적합하며 Python은 데이터 분석 및 기계 학습과 같은 다양한 응용 프로그램에 적합합니다.

PHP와 Python : 그들의 역사에 깊은 다이빙PHP와 Python : 그들의 역사에 깊은 다이빙Apr 18, 2025 am 12:25 AM

PHP는 1994 년에 시작되었으며 Rasmuslerdorf에 의해 개발되었습니다. 원래 웹 사이트 방문자를 추적하는 데 사용되었으며 점차 서버 측 스크립팅 언어로 진화했으며 웹 개발에 널리 사용되었습니다. Python은 1980 년대 후반 Guidovan Rossum에 의해 개발되었으며 1991 년에 처음 출시되었습니다. 코드 가독성과 단순성을 강조하며 과학 컴퓨팅, 데이터 분석 및 기타 분야에 적합합니다.

PHP와 Python 중에서 선택 : 가이드PHP와 Python 중에서 선택 : 가이드Apr 18, 2025 am 12:24 AM

PHP는 웹 개발 및 빠른 프로토 타이핑에 적합하며 Python은 데이터 과학 및 기계 학습에 적합합니다. 1.PHP는 간단한 구문과 함께 동적 웹 개발에 사용되며 빠른 개발에 적합합니다. 2. Python은 간결한 구문을 가지고 있으며 여러 분야에 적합하며 강력한 라이브러리 생태계가 있습니다.

PHP 및 프레임 워크 : 언어 현대화PHP 및 프레임 워크 : 언어 현대화Apr 18, 2025 am 12:14 AM

PHP는 현대화 프로세스에서 많은 웹 사이트 및 응용 프로그램을 지원하고 프레임 워크를 통해 개발 요구에 적응하기 때문에 여전히 중요합니다. 1.PHP7은 성능을 향상시키고 새로운 기능을 소개합니다. 2. Laravel, Symfony 및 Codeigniter와 같은 현대 프레임 워크는 개발을 단순화하고 코드 품질을 향상시킵니다. 3. 성능 최적화 및 모범 사례는 응용 프로그램 효율성을 더욱 향상시킵니다.

PHP의 영향 : 웹 개발 및 그 이상PHP의 영향 : 웹 개발 및 그 이상Apr 18, 2025 am 12:10 AM

phphassignificallyimpactedwebdevelopmentandextendsbeyondit

스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?스칼라 유형, 반환 유형, 노조 유형 및 무효 유형을 포함한 PHP 유형의 힌트 작업은 어떻게 작동합니까?Apr 17, 2025 am 12:25 AM

PHP 유형은 코드 품질과 가독성을 향상시키기위한 프롬프트입니다. 1) 스칼라 유형 팁 : PHP7.0이므로 int, float 등과 같은 기능 매개 변수에 기본 데이터 유형을 지정할 수 있습니다. 2) 반환 유형 프롬프트 : 기능 반환 값 유형의 일관성을 확인하십시오. 3) Union 유형 프롬프트 : PHP8.0이므로 기능 매개 변수 또는 반환 값에 여러 유형을 지정할 수 있습니다. 4) Nullable 유형 프롬프트 : NULL 값을 포함하고 널 값을 반환 할 수있는 기능을 포함 할 수 있습니다.

PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?PHP는 객체 클로닝 (클론 키워드) 및 __clone 마법 방법을 어떻게 처리합니까?Apr 17, 2025 am 12:24 AM

PHP에서는 클론 키워드를 사용하여 객체 사본을 만들고 \ _ \ _ Clone Magic 메소드를 통해 클로닝 동작을 사용자 정의하십시오. 1. 복제 키워드를 사용하여 얕은 사본을 만들어 객체의 속성을 복제하지만 객체의 속성은 아닙니다. 2. \ _ \ _ 클론 방법은 얕은 복사 문제를 피하기 위해 중첩 된 물체를 깊이 복사 할 수 있습니다. 3. 복제의 순환 참조 및 성능 문제를 피하고 클로닝 작업을 최적화하여 효율성을 향상시키기 위해주의를 기울이십시오.

PHP vs. Python : 사용 사례 및 응용 프로그램PHP vs. Python : 사용 사례 및 응용 프로그램Apr 17, 2025 am 12:23 AM

PHP는 웹 개발 및 컨텐츠 관리 시스템에 적합하며 Python은 데이터 과학, 기계 학습 및 자동화 스크립트에 적합합니다. 1.PHP는 빠르고 확장 가능한 웹 사이트 및 응용 프로그램을 구축하는 데 잘 작동하며 WordPress와 같은 CMS에서 일반적으로 사용됩니다. 2. Python은 Numpy 및 Tensorflow와 같은 풍부한 라이브러리를 통해 데이터 과학 및 기계 학습 분야에서 뛰어난 공연을했습니다.

See all articles

핫 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를 무료로 생성하십시오.

뜨거운 도구

MinGW - Windows용 미니멀리스트 GNU

MinGW - Windows용 미니멀리스트 GNU

이 프로젝트는 osdn.net/projects/mingw로 마이그레이션되는 중입니다. 계속해서 그곳에서 우리를 팔로우할 수 있습니다. MinGW: GCC(GNU Compiler Collection)의 기본 Windows 포트로, 기본 Windows 애플리케이션을 구축하기 위한 무료 배포 가능 가져오기 라이브러리 및 헤더 파일로 C99 기능을 지원하는 MSVC 런타임에 대한 확장이 포함되어 있습니다. 모든 MinGW 소프트웨어는 64비트 Windows 플랫폼에서 실행될 수 있습니다.

DVWA

DVWA

DVWA(Damn Vulnerable Web App)는 매우 취약한 PHP/MySQL 웹 애플리케이션입니다. 주요 목표는 보안 전문가가 법적 환경에서 자신의 기술과 도구를 테스트하고, 웹 개발자가 웹 응용 프로그램 보안 프로세스를 더 잘 이해할 수 있도록 돕고, 교사/학생이 교실 환경 웹 응용 프로그램에서 가르치고 배울 수 있도록 돕는 것입니다. 보안. DVWA의 목표는 다양한 난이도의 간단하고 간단한 인터페이스를 통해 가장 일반적인 웹 취약점 중 일부를 연습하는 것입니다. 이 소프트웨어는

SecList

SecList

SecLists는 최고의 보안 테스터의 동반자입니다. 보안 평가 시 자주 사용되는 다양한 유형의 목록을 한 곳에 모아 놓은 것입니다. SecLists는 보안 테스터에게 필요할 수 있는 모든 목록을 편리하게 제공하여 보안 테스트를 더욱 효율적이고 생산적으로 만드는 데 도움이 됩니다. 목록 유형에는 사용자 이름, 비밀번호, URL, 퍼징 페이로드, 민감한 데이터 패턴, 웹 셸 등이 포함됩니다. 테스터는 이 저장소를 새로운 테스트 시스템으로 간단히 가져올 수 있으며 필요한 모든 유형의 목록에 액세스할 수 있습니다.

SublimeText3 Mac 버전

SublimeText3 Mac 버전

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

메모장++7.3.1

메모장++7.3.1

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