钥匙要点
- symfony控制台组件允许开发人员创建结构化和可测试的CLI命令,为命令变得更加复杂提供了各种工具。
> SYMFONY控制台中的问题助手可用于交互式收集命令执行的信息,确保用户输入有效并符合某些条件。
Symfony Console提供了通过表类显示表格数据的能力,这对于显示结构化数据很有用。
- >使用Symfony Console,可以实现进度条,以提供有关执行命令的反馈,并估算操作将花费多长时间。 Symfony控制台组件允许通过着色和样式自定义命令行工具输出,甚至允许使用OutputFormatterStyle类创建自定义样式。
- 本文由Wern Ancheta进行了同行评审。感谢SitePoint所有的同行评审员制作SitePoint内容的最佳状态!
- >不可否认的是,开发软件时的控制台命令有多么有用。不久前,我们重新引入了Symfony Console组件。 >
> 这是我们今天要看的:高级Symfony Console Tools。 >让我们创建一个命令,可以用来显示其中一些功能。大多数基本功能都在对Symfony Console文章的重新引入中显示,因此请务必在进行前进之前检查一下 - 这是一个快速但有用的阅读!
>
>安装
在这里可以找到有关作曲家的基本信息,如果您不熟悉设计良好的孤立的PHP环境,可以在其中开发诸如Vagrant之类的PHP应用程序,我们有一本很棒的书,可以深入地解释所有内容在这里购买。
创建我们的命令
>让我们创建一个最喜欢的命令:fizzbuzz。
>
<span>composer require symfony/console </span>
编写一个从1到x打印数字的程序。但是,对于三个打印“ Fizz”的倍数,而不是数字和倍数的倍数。对于三个和五个倍数的数字,打印“ fizzbuzz”。 我们的命令将收到一个参数,这将是fizzbuzz的最高限制。
>首先,让我们创建我们的fizzbuzz课程。
><span>composer require symfony/console </span>
>非常简单。 FirstNFizzBuzz()方法将FizzBuzz的结果打印出数字的$ MaxValue。它通过递归调用CounculateFizzBuzz()方法来做到这一点。
>接下来,让我们写下我们的命令。创建一个带有以下内容的FizzCommand.php文件:
><span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue </span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span></span></span>
>最后我们的控制台文件。
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span></span>
在这里,我们创建一个新的控制台应用程序,然后将我们的fizzCommand()注册到其中。不要忘记使此文件可执行。
>现在,我们可以通过运行./console命令来检查我们的命令是否正确注册。我们还可以使用./console fizzbuzz:fizzbuzz 25执行命令。这将计算并打印1至25的fizzbuzz结果。
> 到目前为止,我们还没有做任何新的事情。但是有几种方法可以提高命令。首先,命令不是很直观。我们怎么知道我们必须将限制传递给命令?为此,Symfony控制台为我们提供了一个问题。问题助手
helper提供的问题提供了询问用户更多信息的功能。这样,我们可以交互收集信息以执行我们的命令。
>
>让我们将命令更改为,而不是通过命令执行提示符接收执行限制,而是向用户询问限制。为此,助手的问题有一个方法:ask()。此方法作为参数输入接口,输出接口和问题。>
>让我们更改fizzcommand.php文件,这样看起来像这样:>
#!/usr/bin/env php <span><span><?php </span></span><span> </span><span><span>require_once __DIR__ . '/vendor/autoload.php'; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Application</span>; </span></span><span><span>use FizzBuzz<span>\FizzCommand</span>; </span></span><span> </span><span><span>$app = new Application(); </span></span><span><span>$app->add(new FizzCommand()); </span></span><span><span>$app->run(); </span></span></span>>我们不再期望在configure()方法上参数。我们实例化了一个新问题,默认值为25,然后在我们之前讨论的ask()方法上使用它。
现在,我们有一个交互式命令,该命令在执行FizzBuzz之前要求限制。
助手的问题还为我们提供了验证答案的功能。因此,让我们使用它来确保极限是整数。
>
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span><span>use Symfony<span>\Component\Console\Question\Question</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz"); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> </span><span> <span>$helper = $this->getHelper('question'); </span></span><span> <span>$question = new Question('Please select a limit for this execution: ', 25); </span></span><span> <span>$limit = $helper->ask($input, $output, $question); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($limit); </span></span><span> <span>} </span></span><span><span>} </span></span></span>>我们不仅通过使用setValidator()函数确保我们的限制是整数,而且如果用户插入一些空白,并且还将最大尝试量的尝试允许设置为两个。 🎜>
Helper提供的问题提供了更多功能,例如让用户从答案列表中选择,多个答案,隐藏用户答案和自动完成。官方文档有更多有关此的信息。
>表
控制台组件提供的另一个非常有用的功能是显示表格数据的可能性。
要显示一个表,我们需要使用表类;设置标题和行,最后渲染桌子。在显示结构化数据时,这可能非常有用。让我们想象我们要创建一个命令来显示某些公制系统的转换。>让我们将MetricsCommand.php添加到我们的新php文件中。
和我们的新控制台文件:
<span>composer require symfony/console </span>
>这是一个非常简单的命令:它呈现一个表,其中一些值从英寸转换为厘米。如果我们使用./console指标运行命令,则结果将是这样的:
>
>表类还为我们提供了不同的分离器样式。如果您想了解更多信息,请检查此页面。 。
进度栏
>问题和表非常有用,但最重要的要素可能是进度栏。进度条向我们提供有关执行命令的反馈,并让我们清楚地了解我们可能需要等待操作才能完成的时间。
>>进度条对于更长的运行命令至关重要。要使用它们,我们需要进度键,将其传递给总数的总数(如果我们实际知道我们期望多少个单位)并在命令执行时将其推进。
一个带有进度栏的简单命令看起来像这样:
><span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue </span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span></span></span>
和各自的控制台:
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span></span>
这个非常简单的命令。我们通过睡眠()函数设置了栏和循环。最终输出将看起来像:
可以在官方文档中找到有关进度条的更多信息。
>自定义我们的进度栏
>自定义进度栏对于用户等待时提供额外信息可能很有用。
默认情况下,进度条中显示的信息取决于输出接口实例的冗长级别。因此,如果我们想显示不同级别的信息,我们可以使用setFormat()方法。内置格式是:正常,冗长,umey_verbose和debug。
#!/usr/bin/env php <span><span><?php </span></span><span> </span><span><span>require_once __DIR__ . '/vendor/autoload.php'; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Application</span>; </span></span><span><span>use FizzBuzz<span>\FizzCommand</span>; </span></span><span> </span><span><span>$app = new Application(); </span></span><span><span>$app->add(new FizzCommand()); </span></span><span><span>$app->run(); </span></span></span>
例如,如果我们使用普通格式,则结果将如下所示:
>
我们还可以设置自己的格式。
>进度栏是由不同特定占位符组成的字符串。我们可以将这些特定的占位持有人结合起来,以创建自己的进度栏。可用的占位符为:当前,最大,栏,百分比,经过,剩余,估计,内存和消息。因此,例如,如果我们想复制完全相同的默认进度栏,我们可以使用以下内容:
>自定义进度条还有更多的内容 - 在此处阅读有关。
><span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span><span>use Symfony<span>\Component\Console\Question\Question</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz"); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> </span><span> <span>$helper = $this->getHelper('question'); </span></span><span> <span>$question = new Question('Please select a limit for this execution: ', 25); </span></span><span> <span>$limit = $helper->ask($input, $output, $question); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($limit); </span></span><span> <span>} </span></span><span><span>} </span></span></span>>在命令中调用命令
>具有另一个非常有用的功能是能够在命令中运行命令。例如,我们可能有一个命令,该命令取决于另一个命令成功运行的命令,或者我们可能希望以序列运行的一系列命令。
> 例如,想象一下,想象我们想创建一个命令来运行我们的fizzbuzz命令。 我们需要在 /src文件夹和execute()方法内创建一个新命令,请具有以下内容:
><span>composer require symfony/console </span>
>由于我们的fizzbuzz命令没有收到任何论点,这就是足够的。如果我们的命令需要参数,我们将不得不创建一系列参数,并使用arrayInput类通过它们。
除此之外颜色和样式
>着色和样式输出对于向用户提醒或通知用户的执行中的某些内容很有用。为此,我们只需要在Writeln()方法中添加以下标签,就像以下内容:
>也可以选择使用outputformatterstyle类来定义我们自己的样式:
<span><span><?php </span></span><span><span>declare(strict_types=1); </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>class Fizzbuzz{ </span></span><span> </span><span> <span>public function isFizz(int $value): bool{ </span></span><span> <span>if($value % 3 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function isBuzz(int $value): bool{ </span></span><span> <span>if($value % 5 === 0){ </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>return false; </span></span><span> <span>} </span></span><span> </span><span> <span>public function calculateFizzBuzz(int $number): bool{ </span></span><span> <span>if($this->isFizz($number) && $this->isBuzz($number)){ </span></span><span> <span>echo "FizzBuzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isFizz($number)){ </span></span><span> <span>echo "Fizz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>if($this->isBuzz($number)){ </span></span><span> <span>echo "Buzz \n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> <span>echo $number . "\n"; </span></span><span> <span>return true; </span></span><span> <span>} </span></span><span> </span><span> <span>public function firstNFizzbuzz(int $maxValue): void{ </span></span><span> <span>$startValue = 1; </span></span><span> </span><span> <span>while($startValue </span><span> <span>$this->calculateFizzBuzz($startValue); </span></span><span> <span>$startValue++; </span></span><span> <span>} </span></span><span> <span>} </span></span><span><span>} </span></span></span></span>
有关造型的更多信息,可以在此处找到输出。
<span><span><?php </span></span><span> </span><span><span>namespace FizzBuzz; </span></span><span> </span><span><span>use Symfony<span>\Component\Console\Command\Command</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Output\OutputInterface</span>; </span></span><span><span>use Symfony<span>\Component\Console\Input\InputArgument</span>; </span></span><span> </span><span><span>use FizzBuzz<span>\Fizzbuzz</span>; </span></span><span> </span><span><span>class FizzCommand extends Command{ </span></span><span> </span><span> <span>protected function configure(){ </span></span><span> <span>$this->setName("FizzBuzz:FizzBuzz") </span></span><span> <span>->setDescription("Runs Fizzbuzz") </span></span><span> <span>->addArgument('Limit', InputArgument<span>::</span>REQUIRED, 'What is the limit you wish for Fizzbuzz?'); </span></span><span> <span>} </span></span><span> </span><span> <span>protected function execute(InputInterface $input, OutputInterface $output){ </span></span><span> </span><span> <span>$fizzy = new FizzBuzz(); </span></span><span> <span>$input = $input->getArgument('Limit'); </span></span><span> </span><span> <span>$result = $fizzy->firstNFizzbuzz($input); </span></span><span> <span>} </span></span><span> </span><span><span>} </span></span></span>>
总结
从样式到助手,我们看到了Symfony控制台开箱即用的许多功能。今天之后,绝对没有任何借口可以记录下来的命令行工具!
>您经常使用哪些助手和组件?您如何启动CLI工具? Symfony控制台是否足够适合您,还是您更喜欢替代方案?
经常询问有关Symfony Console的问题(常见问题解答)Symfony控制台和其他PHP控制台应用程序之间的关键差异是什么? Symfony Console是Symfony PHP框架的组成部分,它提供了一种创建命令行界面(CLI)的方法。与其他PHP控制台应用程序不同,Symfony Console为构建CLI应用程序提供了一种结构化和面向对象的方法。它提供了一组类来定义命令,处理输入和输出并管理应用程序的生命周期。此外,Symfony控制台支持颜色格式,进度条,表格和其他高级控制台功能,这些功能在其他PHP控制台应用程序中未常见。
如何在Symfony Console中创建自定义命令?在Symfony控制台中创建自定义命令涉及扩展命令类并实现configure()和execute()方法。 configure()方法用于定义命令名称,参数和选项,而execute()方法包含命令的逻辑。创建命令类后,可以使用add()方法添加到应用输出接口以处理命令中的输入和输出。 InputInterface提供了获取命令参数和选项的方法,而输出接口提供了写入控制台的方法。您还可以使用InputArgument和InputOption类来定义命令参数和选项。
>>我如何在Symfony控制台中使用助手? SYMFONY控制台提供指挥所类测试命令。 CommandTester类允许您执行具有特定输入的命令并捕获输出。然后,您可以在输出上做出断言以验证命令的行为。
如何处理Symfony控制台中的错误?
>
>我如何在Symfony Framework之外使用Symfony Console组件?>
>如何创建具有多个命令的控制台应用程序?以使用多个命令创建控制台应用程序,您可以在应用程序中添加多个命令类。每个命令类应扩展命令类,并实现configure()和execute()方法。然后,您可以使用应用程序的add()方法添加命令。
>
>如何使用Symfony Console组件来自动化任务?> Symfony Console Component可以用于自动化通过创建执行特定任务并从命令行或脚本运行这些命令的命令来完成任务。您还可以使用诸如cron之类的任务调度程序安排命令以特定的间隔运行。
>以上是超越基础知识的符号控制台 - 助手和其他工具的详细内容。更多信息请关注PHP中文网其他相关文章!

PHP仍然流行的原因是其易用性、灵活性和强大的生态系统。1)易用性和简单语法使其成为初学者的首选。2)与web开发紧密结合,处理HTTP请求和数据库交互出色。3)庞大的生态系统提供了丰富的工具和库。4)活跃的社区和开源性质使其适应新需求和技术趋势。

PHP和Python都是高层次的编程语言,广泛应用于Web开发、数据处理和自动化任务。1.PHP常用于构建动态网站和内容管理系统,而Python常用于构建Web框架和数据科学。2.PHP使用echo输出内容,Python使用print。3.两者都支持面向对象编程,但语法和关键字不同。4.PHP支持弱类型转换,Python则更严格。5.PHP性能优化包括使用OPcache和异步编程,Python则使用cProfile和异步编程。

PHP主要是过程式编程,但也支持面向对象编程(OOP);Python支持多种范式,包括OOP、函数式和过程式编程。PHP适合web开发,Python适用于多种应用,如数据分析和机器学习。

PHP起源于1994年,由RasmusLerdorf开发,最初用于跟踪网站访问者,逐渐演变为服务器端脚本语言,广泛应用于网页开发。Python由GuidovanRossum于1980年代末开发,1991年首次发布,强调代码可读性和简洁性,适用于科学计算、数据分析等领域。

PHP适合网页开发和快速原型开发,Python适用于数据科学和机器学习。1.PHP用于动态网页开发,语法简单,适合快速开发。2.Python语法简洁,适用于多领域,库生态系统强大。

PHP在现代化进程中仍然重要,因为它支持大量网站和应用,并通过框架适应开发需求。1.PHP7提升了性能并引入了新功能。2.现代框架如Laravel、Symfony和CodeIgniter简化开发,提高代码质量。3.性能优化和最佳实践进一步提升应用效率。

PHPhassignificantlyimpactedwebdevelopmentandextendsbeyondit.1)ItpowersmajorplatformslikeWordPressandexcelsindatabaseinteractions.2)PHP'sadaptabilityallowsittoscaleforlargeapplicationsusingframeworkslikeLaravel.3)Beyondweb,PHPisusedincommand-linescrip

PHP类型提示提升代码质量和可读性。1)标量类型提示:自PHP7.0起,允许在函数参数中指定基本数据类型,如int、float等。2)返回类型提示:确保函数返回值类型的一致性。3)联合类型提示:自PHP8.0起,允许在函数参数或返回值中指定多个类型。4)可空类型提示:允许包含null值,处理可能返回空值的函数。


热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

Atom编辑器mac版下载
最流行的的开源编辑器

SublimeText3 Linux新版
SublimeText3 Linux最新版

mPDF
mPDF是一个PHP库,可以从UTF-8编码的HTML生成PDF文件。原作者Ian Back编写mPDF以从他的网站上“即时”输出PDF文件,并处理不同的语言。与原始脚本如HTML2FPDF相比,它的速度较慢,并且在使用Unicode字体时生成的文件较大,但支持CSS样式等,并进行了大量增强。支持几乎所有语言,包括RTL(阿拉伯语和希伯来语)和CJK(中日韩)。支持嵌套的块级元素(如P、DIV),

禅工作室 13.0.1
功能强大的PHP集成开发环境

SecLists
SecLists是最终安全测试人员的伙伴。它是一个包含各种类型列表的集合,这些列表在安全评估过程中经常使用,都在一个地方。SecLists通过方便地提供安全测试人员可能需要的所有列表,帮助提高安全测试的效率和生产力。列表类型包括用户名、密码、URL、模糊测试有效载荷、敏感数据模式、Web shell等等。测试人员只需将此存储库拉到新的测试机上,他就可以访问到所需的每种类型的列表。