이 기사는 Hyperf에 대한 최신 소식을 제공합니다. 주로 Hyperf 3.0의 최신 릴리스와 새로운 기능에 대해 소개합니다. 관심 있는 친구라면 꼭 살펴보시기 바랍니다. .
Hyperf 3.0, 새로운 시대가 온다
Review
지난 1년 반 동안 Hyperf 2.2는 총 35
개의 마이너 버전을 출시하여 Hyperf를 전례없는 높이, 여기에서 좋은 데이터 피드백을 얻었습니다. 35
个小版本,使 Hyperf 达到了一个前所未有的高度
,这里也获得了一些不错的数据反馈。
Hyperf 在 GitHub
和 Gitee
上的关注度也得到了显著提升,分别获得了 4.9k
和 791
个 star
,整体关注度增长也很稳定。
Hyperf 框架的安装量也达到了 90万次
,每天都有约 1300次
的安装,这也表明了 Hyperf 已经广泛应用
于相关行业中并支撑了大量的系统运行。
Hyperf 组织下的有效 repo 更是达到了约 140个
(去除掉 Archive 项目后),维护工作量空前巨大,但迭代仍然高频。
感谢 Hyperf 团队全体成员的辛勤以及贡献,同时也感谢所有的 PR 贡献者,没有你们的参与也就没有今天的 Hyperf。
Thanks ALL Contributors
Hyperf 3.0 新时代
Hyperf 3.0 带来了很多非常有意思的新能力,其中一些新能力不乏是 PHP 领域里面前所未有
的,当然这些新能力也脱离不了其他开源社区的积极发展,包括但不限于 PHP
、Swoole
、Swow
、PHPMicro
、DTM
、Seata
等开源社区,也衷心希望大家在闲暇时间可以为这些开源社区也贡献出自己的一份力,搭上一砖一瓦,共建更加美好的未来。
原生注解(Attribute)
随着 PHP 8.1、8.2 的发布,给 PHP 带来了很多新的特性,其中与 Hyperf 最为相关的就是 PHP 的原生注解(Attribute)
了,Hyperf 3.0 也放弃了过往采用的基于注释解析的注解功能实现,转而采用 PHP 的原生注解,当然对应依赖的 PHP 版本,也将调整为最低要求 PHP 8.0。
我们以一个最简单的 Controller 案例来呈现新的原生注解的使用:
<?php declare(strict_types=1); namespace App\Controller; use Hyperf\HttpServer\Contract\RequestInterface; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\RequestMapping; #[Controller] class IndexController { // Hyperf 会自动为此方法生成一个 /index/index 的路由,允许通过 GET 或 POST 方式请求 #[RequestMapping(path: "index", methods: "get,post")] public function index(RequestInterface $request) { // 从请求中获得 id 参数 $id = $request->input('id', 1); return (string)$id; } }
同时随着原生注解的应用,在 3.0 中也能够支持在同一个位置重复应用同一个注解了,比如过往在一个 Controller Action 想要应用多个 Middleware 时,需要通过 @Middlewares
注解包含多个 @Middleware
注解实现应用,而在 3.0 则可直接书写多个 @Middleware
注解实现该应用。同时在 3.0 中,注解也可以应用在方法的参数上,以实现一些针对方法参数定义、参数解析等功能。
从 注释注解 调整为 原生注解,也无需担忧过往项目的迁移改造工作量,Hyperf 也提供了对应的工具一键自动转换,只需要在 2.2 时引入 hyperf/code-generator
组件,并执行 php bin/hyperf.php code:generate -D app
命令,即可将 app
GitHub
및 Gitee
에 대한 Hyperf의 관심도 각각 4.9k
및 791로 크게 증가했습니다. code>star
이며 전반적인 관심도 증가도 매우 안정적입니다. 🎜🎜
900,000회
에 이르렀고, 매일 약 1300
설치가 발생하는 등 Hyperf가 널리 사용
되었음을 보여줍니다. code> in 관련 업계의 다수의 시스템 운영을 지원합니다. 🎜🎜
140
에 도달했습니다(아카이브 프로젝트 제거 후). 유지 관리 작업량은 전례 없이 크지만 반복 빈도는 여전히 높습니다. 🎜🎜

전례가 없는
것입니다. 물론 이러한 새로운 기능은 다른 기능과도 분리될 수 없습니다. PHP
, Swoole
, Swow
, PHPMicro
, DTM
, Seata
및 기타 오픈 소스 커뮤니티 여러분도 여가 시간에 이러한 오픈 소스 커뮤니티에 기여하고 벽돌을 쌓고 더 나은 세상을 만들 수 있기를 진심으로 바랍니다. 함께. 🎜🎜🎜네이티브 주석(속성)
🎜PHP 8.1 및 8.2가 출시되면서 많은 새로운 기능이 PHP에 추가되었으며, 그중 Hyperf와 가장 관련성이 높은 것은 PHP의네이티브 주석( 속성 )
, Hyperf 3.0에서는 이전에 사용된 주석 구문 분석을 기반으로 하는 주석 기능 구현을 포기하고 대신 PHP의 기본 주석을 채택했습니다. 물론 해당 종속 PHP 버전도 PHP 8.0의 최소 요구 사항에 맞게 조정됩니다. . 🎜🎜가장 간단한 컨트롤러 사례를 사용하여 새로운 기본 주석의 사용을 제시합니다. 🎜<?php namespace App\Controller; use DtmClient\TCC; use DtmClient\TransContext; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\GetMapping; use Throwable; #[Controller(prefix: '/tcc')] class TccController { protected string $serviceUri = 'http://127.0.0.1:9501'; #[Inject] protected TCC $tcc; #[GetMapping(path: 'successCase')] public function successCase() { try { $this->tcc->globalTransaction(function (TCC $tcc) { // 创建子事务 A 的调用数据 $tcc->callBranch( // 调用 Try 方法的参数 ['amount' => 30], // Try 方法的 URL $this->serviceUri . '/tcc/transA/try', // Confirm 方法的 URL $this->serviceUri . '/tcc/transA/confirm', // Cancel 方法的 URL $this->serviceUri . '/tcc/transA/cancel' ); // 创建子事务 B 的调用数据,以此类推 $tcc->callBranch( ['amount' => 30], $this->serviceUri . '/tcc/transB/try', $this->serviceUri . '/tcc/transB/confirm', $this->serviceUri . '/tcc/transB/cancel' ); }); } catch (Throwable $e) { var_dump($e->getMessage(), $e->getTraceAsString()); } // 通过 TransContext::getGid() 获得 全局事务ID 并返回 return TransContext::getGid(); } }🎜동시에 기본 주석을 적용하면 3.0에서는 동일한 위치에 동일한 주석을 반복적으로 적용하는 것도 가능합니다. 예를 들어 과거에는 컨트롤러 작업이 여러 미들웨어를 적용하려는 경우 3.0에서 애플리케이션을 구현하려면
@Middlewares
주석을 통해 여러 @Middleware
주석을 포함해야 했습니다. , 이 애플리케이션을 구현하는 여러 @Middleware
주석을 직접 작성할 수 있습니다. 동시에 3.0에서는 메소드 매개변수 정의 및 매개변수 구문 분석과 같은 일부 기능을 구현하기 위해 메소드 매개변수에 주석을 적용할 수도 있습니다. 🎜🎜주석에서 기본 주석으로 조정할 때 이전 프로젝트의 마이그레이션 및 변환 작업량에 대해 걱정할 필요가 없습니다. Hyperf도 한 번의 클릭으로 자동 변환을 위한 해당 도구를 제공합니다. 2.2 > 구성 요소의 Generator를 실행하고 php bin/hyperf.php code:generate -D app
명령을 실행하여 app
폴더의 주석을 기본 주석으로 자동 변환합니다. 쉽게 노력을 아끼세요~🎜分布式事务
在过去的一年里,Hyperf 团队也为 PHP 领域孵化了两个前所未有的分布式事务组件并贡献到对应的开源社区,对应 DTM
(首个基于 Go 语言实现的流行分布式事务管理器) 与 Seata
(由阿里巴巴开源的流行分布式事务管理器) 两款主流的开源分布式事务管理器,分别是 dtm-php/dtm-client 和 seata/seata-php ,其中 dtm-php
是实现了 dtm 完整功能的分布式事务客户端,已支持 TCC模式
、Saga
、XA
、二阶段消息
模式的分布式事务模式,并分别实现了与 DTM Server 以 HTTP 协议
或 gRPC 协议
通讯,该客户端可安全运行于 PHP-FPM 和 Swoole 协程环境中,更是对 Hyperf 框架做了更加易用的功能支持,可应用于生产环境中,而 seata-php
仍在开发迭代中,尚未能用于生产环境,也希望能有更多人参与进来共同迭代。
我们也以一个简单的例子来说明如何在 Hyperf 中实现一个 TCC
分布式事务的调用,其它分布式事务模式可查阅 dtm-php repo 的 README 文件,或 Hyperf 3.0 文档关于分布式事务一章。
<?php namespace App\Controller; use DtmClient\TCC; use DtmClient\TransContext; use Hyperf\Di\Annotation\Inject; use Hyperf\HttpServer\Annotation\Controller; use Hyperf\HttpServer\Annotation\GetMapping; use Throwable; #[Controller(prefix: '/tcc')] class TccController { protected string $serviceUri = 'http://127.0.0.1:9501'; #[Inject] protected TCC $tcc; #[GetMapping(path: 'successCase')] public function successCase() { try { $this->tcc->globalTransaction(function (TCC $tcc) { // 创建子事务 A 的调用数据 $tcc->callBranch( // 调用 Try 方法的参数 ['amount' => 30], // Try 方法的 URL $this->serviceUri . '/tcc/transA/try', // Confirm 方法的 URL $this->serviceUri . '/tcc/transA/confirm', // Cancel 方法的 URL $this->serviceUri . '/tcc/transA/cancel' ); // 创建子事务 B 的调用数据,以此类推 $tcc->callBranch( ['amount' => 30], $this->serviceUri . '/tcc/transB/try', $this->serviceUri . '/tcc/transB/confirm', $this->serviceUri . '/tcc/transB/cancel' ); }); } catch (Throwable $e) { var_dump($e->getMessage(), $e->getTraceAsString()); } // 通过 TransContext::getGid() 获得 全局事务ID 并返回 return TransContext::getGid(); } }
至于其它事务模式,如 Saga
、XA
、二阶段消息
模式等,可以具体查阅 dtm-php/dtm-client
仓库的 Readme 文件或 Hyperf 3.0 的相关文档。
Swow 网络引擎
实际上在 Hyperf 2.2 中,就已经支持了 Swow 网络引擎的运行,随着 Swow 1.0 正式版的发布,在 Hyperf 3.0 中,我们也把 Swow 的应用提高到了一个更高的高度,Swow 实现了一套有史以来最完整的 PHP 协程模型
,它全面释放了 PHP 的真正实力,使得开发者可以做到以往难以想象的事情,对比 Swoole 它具备更好的兼容性
、可调试性
、可编程性
,它甚至能使 Hyperf 运行于原生 Windows 环境
下而无需借助 WSL 或 Docker,同时也提供了 SDB
和 Watchdog
工具对协程运行进行调试和监控,极大的提升了 Hyperf 的可调试性。
我们提供了一个全新的 Skeleton 骨架项目用于快速创建一个基于 Swow 网络引擎的 Hyperf 应用,以下是一个简单的通过 Composer
创建应用的流程:
composer create-project hyperf/swow-skeleton:dev-master
创建后,确保您的 PHP 环境已经安装好了 Swow 扩展,便可直接通过 php bin/hyperf.php start
命令启动服务,整体使用与原来无异,Hyperf 底层已做好了适配。在 Windows 环境中也只需在 CMD
或者 Poweshell
中运行即可哦~
SDB 协程调试器
SDB
是一款使用 PHP 语言编写的协程调试器
工具,使用上类似于 GDB
,它具有以下的几个优点:
使用简单,只需要一行代码即可开启;
无需端口,可直接运行在
TTY
上;零成本,可在生产环境使用,不影响性能;
功能强大,深度定制,量身打造类微型操作系统;
通过 SDB
,您可以对运行中的 Hyperf 应用进行交互,以实现查看当前所有协程状态
、窥视协程
、进入指定协程
、查看调用栈
、打断点
、单步调试
、查看及修改变量调试
、扫描僵尸协程
、Kill 协程
等操作,真正意义上的将 PHP 协程带到了工程化的实用阶段
。
Watchdog
Watchdog
为 PHP 提供了 CPU 调度能力,其核心原理是 Watchdog
线程会定期检查其它线程中协程的活跃度情况,若发现工作线程中的协程不再活跃,则通过 ZendVM
的中断机制对其进行状态确认,若 VM
中断失败,则表明工作线程陷入了系统调用阻塞,触发告警;若 VM
中断成功,则表明工作线程陷入了 CPU 密集运算或死循环,则立即触发用户设定的调度规则进行调度。
通过 Watchdog
可以实现 可编程的协程调度机制
,可以非常方便的解决过往头疼的 CPU 饥饿
问题,以下是一些用法的演示:
// 运行超过 1ms 就让出控制权 \Swow\WatchDog::run(1 * 1000 * 1000); // 运行超过 1ms 就让出 10ms,调度失败并超过 5ms 时视为系统调用阻塞 \Swow\WatchDog::run(1 * 1000 * 1000, 5 * 1000 * 1000, 10); // 可编程方式,函数会在程序阻塞 100ms 后触发 $alertCountMap = new WeakMap(); \Swow\WatchDog::run(quantum: 100 * 1000 * 1000, alerter: static function () use ($alertCountMap): void { $coroutine = Coroutine::getCurrent(); $alertCount = ($alertCountMap[$coroutine] ??= 0) + 1; $alertCountMap[$coroutine] = $alertCount; echo 'CPU starvation occurred, suspend this coroutine...' . PHP_EOL; sleep(0); if ($alertCount > 5) { echo 'Kill the bad guy' . PHP_EOL; $coroutine->kill(); } });
更多用法
关于 SDB
和 WatchDog
以及更多用法目前文档可能尚未完善,我们接下来也会编写多篇文章来阐述用法,也会尽快完善相关文档~
【推荐学习:PHP视频教程】
Box
Box 是一个致力于帮助提升 PHP 应用程序的编程体验的工具,尤其有助于 Hyperf 应用,可以用于管理 PHP 环境和相关依赖
,同时提供将 PHP 应用程序打包为二进制程序
的能力,还提供反向代理服务
来管理和部署 Swoole/Swow 服务。这些能力也是前所未有的,特别是将 Hyperf 或 PHP 应用打包为二进制程序的能力,打包好的程序,可以不依赖系统的 PHP 环境
单独运行,以达到类似于 Go 语言的打包能力,这些能力也得益于 phpmicro
的发展,而 Box 则是站在巨人的肩膀上,将这些能力以更加简单易用的方式提供给大家使用~
以下是一个通过下载 Box 到创建一个 Hyperf 应用,并运行的简单案例:
安装 Box
// Mac wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_macos -O box sudo mv ./box /usr/local/bin/box sudo chmod 755 /usr/local/bin/box // 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中 // Linux x86_64 wget https://github.com/hyperf/box/releases/download/v0.5.5/box_x86_64_linux -O box sudo mv ./box /usr/local/bin/box sudo chmod 755 /usr/local/bin/box // 确保 /usr/local/bin/box 在你的 $PATH 环境中,或者将 `box` 放到你想要的任意 $PATH 路径中 // Windows curl -o box.exe https://github.com/hyperf/box/releases/download/v0.5.5/box_x64_windows.exe // 将 `box.exe` 放到你想要的任意 Path 环境变量路径中,同时 Windows 版本在执行时需要在命令行中使用 `box.exe` 而不是 `box`
初始化 Github Access Token
Box 需要一个 Github 访问令牌来请求 Github API,以便于从 GitHub Actions 的 Artifacts 中检索包的版本。
创建 Github Access Token,
workflow
范围需要勾选;运行
box config set github.access-token <your token></your>
命令来设置您的token
;
我们将在 v0.6 版本让使用 Box 前无需设置 Github Access Token,以提供更加简便的使用体验,请期待~
通过 Box 初始化 PHP 环境并启动 Hyperf
// 通过 box 安装 PHP 8.1,此安装不会影响系统原来自身安装的 PHP box get php@8.1 // 通过 box 安装 composer box get composer // 通过 box composer 创建 hyperf 应用,可指定 dev-master 分支以防止 packagist 代理数据落后的问题 box composer create-project hyperf/swow-skeleton:dev-master // 通过 box 启动 hyperf box hyperf start
至此一个完整的安装和运行流程已完成,我们可以发现过往复杂的环境部署环节,已经简化为了区区几个命令,通过 &&
连接符甚至可以组成一行命令足以。
通过 Box 打包 Hyperf 应用为二进制程序
这个神奇的能力
,在操作上也被简化得匪夷所思,只需预先执行 box build-prepare
命令提前下载好相关依赖,这个命令只需执行一次即可,后续即可通过 box build
命令对当前所在文件夹的 Hyperf 应用进行打包动作。打包好后,当前文件夹会出现一个名为 hyperf
的二进制文件,后续只需要通过 hyperf start
命令即可启动该 Hyperf 应用。
Box 自身就是一个基于 Box 打包出来的 Hyperf 应用,大家也可以通过了解 Box 项目本身,来了解该能力的使用。
Box Kernel 切换
默认情况下,Box 由 Swow
Kernel 提供支持,但是我们也提供了 Swoole
Kernel,您可以通过 box config set kernel swoole
来切换为 Swoole Kernel,但是需要注意的是,Swoole Kernel 仅支持 PHP 8.1 版本,且不支持
构建二进制程序功能和 Windows 系统环境。
// 设置为 Swow Kernel [默认] box config set kernel swow // 设置为 Swoole Kernel (不支持 Windows) box config set kernel swoole
Box 的更多能力
Box 还有更多有意思的使用方法和工具组合,可以通过下面的部分的命令清单快速一览
命令
box get pkg@version从远程安装包,pkg是包名,version是包的版本,box get pkg表示安装最新版本的 pkg,例如, 运行 box get php@8.1 安装 PHP 8.1, 运行 box get composer 安装最新的 composer bin box build-prepare 为 build 和 build-self 命令做好相关环境的准备 box build-self 构建 box bin 本身 box build <path> 将 Hyperf 应用程序构建成二进制文件 box self-update 将 box bin 更新至最新版本 box config set-php-version <version>设置 box 的当前 PHP 版本,可用值:8.0 | 8.1 box config get-php-version <version>获取 box 的当前设置的 PHP 版本 box reverse-proxy -u <upstreamport> 启动一个反向代理 HTTP 服务器,用于将 HTTP 请求转发到指定的多个上游服务器 box php <argument> 通过当前 box 的 PHP 版本运行任何 PHP 命令 box composer <argument>通过当前 box 的 PHP 版本运行任何 Composer 命令 box php-cs-fixer <argument> 通过当前 box 的 PHP 版本运行任何 php-cs-fixer 命令 box cs-fix <argument> 通过当前 box 的 PHP 版本运行 php-cs-fixer fix 命令 box phpstan <argument> 通过当前 box 的 PHP 版本运行任何 phpstan 命令 box pint <argument> 通过当前 box 的 PHP 版本运行任何 pint 命令</argument></argument></argument></argument></argument></argument></upstreamport></version></version></path>
更多优化
Hyperf 3.0 仍做了大量的优化和调整,具体可以阅读 Hyperf 主仓库中的 CHANGELOG-3.0.md 文件。
同时我们也为大家准备了一份从 2.2 升级至 3.0 的指南,具体可查阅 Hyperf 官方文档 - 3.0 升级指南 一章。
위 내용은 PHP Hyperf 3.0 출시! 새로운 기능 간단히 살펴보기의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

PHP는 현대 웹 개발, 특히 컨텐츠 관리 및 전자 상거래 플랫폼에서 중요합니다. 1) PHP는 Laravel 및 Symfony와 같은 풍부한 생태계와 강력한 프레임 워크 지원을 가지고 있습니다. 2) Opcache 및 Nginx를 통해 성능 최적화를 달성 할 수 있습니다. 3) PHP8.0은 성능을 향상시키기 위해 JIT 컴파일러를 소개합니다. 4) 클라우드 네이티브 애플리케이션은 Docker 및 Kubernetes를 통해 배포되어 유연성과 확장 성을 향상시킵니다.

PHP는 특히 빠른 개발 및 동적 컨텐츠를 처리하는 데 웹 개발에 적합하지만 데이터 과학 및 엔터프라이즈 수준의 애플리케이션에는 적합하지 않습니다. Python과 비교할 때 PHP는 웹 개발에 더 많은 장점이 있지만 데이터 과학 분야에서는 Python만큼 좋지 않습니다. Java와 비교할 때 PHP는 엔터프라이즈 레벨 애플리케이션에서 더 나빠지지만 웹 개발에서는 더 유연합니다. JavaScript와 비교할 때 PHP는 백엔드 개발에서 더 간결하지만 프론트 엔드 개발에서는 JavaScript만큼 좋지 않습니다.

PHP와 Python은 각각 고유 한 장점이 있으며 다양한 시나리오에 적합합니다. 1.PHP는 웹 개발에 적합하며 내장 웹 서버 및 풍부한 기능 라이브러리를 제공합니다. 2. Python은 간결한 구문과 강력한 표준 라이브러리가있는 데이터 과학 및 기계 학습에 적합합니다. 선택할 때 프로젝트 요구 사항에 따라 결정해야합니다.

PHP는 서버 측에서 널리 사용되는 스크립팅 언어이며 특히 웹 개발에 적합합니다. 1.PHP는 HTML을 포함하고 HTTP 요청 및 응답을 처리 할 수 있으며 다양한 데이터베이스를 지원할 수 있습니다. 2.PHP는 강력한 커뮤니티 지원 및 오픈 소스 리소스를 통해 동적 웹 컨텐츠, 프로세스 양식 데이터, 액세스 데이터베이스 등을 생성하는 데 사용됩니다. 3. PHP는 해석 된 언어이며, 실행 프로세스에는 어휘 분석, 문법 분석, 편집 및 실행이 포함됩니다. 4. PHP는 사용자 등록 시스템과 같은 고급 응용 프로그램을 위해 MySQL과 결합 할 수 있습니다. 5. PHP를 디버깅 할 때 error_reporting () 및 var_dump ()와 같은 함수를 사용할 수 있습니다. 6. 캐싱 메커니즘을 사용하여 PHP 코드를 최적화하고 데이터베이스 쿼리를 최적화하며 내장 기능을 사용하십시오. 7

PHP가 많은 웹 사이트에서 선호되는 기술 스택 인 이유에는 사용 편의성, 강력한 커뮤니티 지원 및 광범위한 사용이 포함됩니다. 1) 배우고 사용하기 쉽고 초보자에게 적합합니다. 2) 거대한 개발자 커뮤니티와 풍부한 자원이 있습니다. 3) WordPress, Drupal 및 기타 플랫폼에서 널리 사용됩니다. 4) 웹 서버와 밀접하게 통합하여 개발 배포를 단순화합니다.

PHP는 현대적인 프로그래밍, 특히 웹 개발 분야에서 강력하고 널리 사용되는 도구로 남아 있습니다. 1) PHP는 사용하기 쉽고 데이터베이스와 완벽하게 통합되며 많은 개발자에게 가장 먼저 선택됩니다. 2) 동적 컨텐츠 생성 및 객체 지향 프로그래밍을 지원하여 웹 사이트를 신속하게 작성하고 유지 관리하는 데 적합합니다. 3) 데이터베이스 쿼리를 캐싱하고 최적화함으로써 PHP의 성능을 향상시킬 수 있으며, 광범위한 커뮤니티와 풍부한 생태계는 오늘날의 기술 스택에 여전히 중요합니다.

PHP에서는 약한 참조가 약한 회의 클래스를 통해 구현되며 쓰레기 수집가가 물체를 되 찾는 것을 방해하지 않습니다. 약한 참조는 캐싱 시스템 및 이벤트 리스너와 같은 시나리오에 적합합니다. 물체의 생존을 보장 할 수 없으며 쓰레기 수집이 지연 될 수 있음에 주목해야합니다.

\ _ \ _ 호출 메소드를 사용하면 객체를 함수처럼 호출 할 수 있습니다. 1. 객체를 호출 할 수 있도록 메소드를 호출하는 \ _ \ _ 정의하십시오. 2. $ obj (...) 구문을 사용할 때 PHP는 \ _ \ _ invoke 메소드를 실행합니다. 3. 로깅 및 계산기, 코드 유연성 및 가독성 향상과 같은 시나리오에 적합합니다.


핫 AI 도구

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

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

Undress AI Tool
무료로 이미지를 벗다

Clothoff.io
AI 옷 제거제

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

인기 기사

뜨거운 도구

드림위버 CS6
시각적 웹 개발 도구

안전한 시험 브라우저
안전한 시험 브라우저는 온라인 시험을 안전하게 치르기 위한 보안 브라우저 환경입니다. 이 소프트웨어는 모든 컴퓨터를 안전한 워크스테이션으로 바꿔줍니다. 이는 모든 유틸리티에 대한 액세스를 제어하고 학생들이 승인되지 않은 리소스를 사용하는 것을 방지합니다.

에디트플러스 중국어 크랙 버전
작은 크기, 구문 강조, 코드 프롬프트 기능을 지원하지 않음

스튜디오 13.0.1 보내기
강력한 PHP 통합 개발 환경

WebStorm Mac 버전
유용한 JavaScript 개발 도구
