昔日辉煌不再,PHP老矣,尚能饭否?

导语 | 近期 TIOBE 最新指数显示,PHP 的流行度降至了历史最低,排在第 17 名,同时,在年度 Stack Overflow 开发者调查报告中,PHP 在开发者中的受欢迎程度已经从之前的约 30% 萎缩至现在的 18%。“PHP 是世界上最好的语言”已成为承载程序员黑色幽默的热梗。在满是唱衰的市场环境中,究竟 PHP 是否真的没有前景,是否已经不值得学习了?今天,我们特邀了识沃科技 CEO 韩天峰老师,他将为我们深入解读 PHP 的发展现状和未来发展趋势。

作者简介

韩天峰,识沃科技 CEO,Swoole 开源项目创始人,PHP 官方 PECL 开发组成员。曾任好未来学而思网校首席架构师,在腾讯朋友网、淘宝搜索、虎牙直播等互联网企业担任架构师和技术负责人。

一、PHP从辉煌到走向没落?

众所周知,PHP 语言诞生于 1995 年,它最初只是一个处理 HTTP 表单的脚本工具。在后续的版本中增加了 MySQL 数据库查询的支持,才逐渐成为一门独立的 Web 项目开发语言。随着互联网的迅猛发展,因PHP易学易用和强大的开发社区而备受青睐,成为了互联网应用开发的主要语言之一。与 Linux、MySQL、Apache 合并称为 LAMP 技术栈,LAMP 对互联网的影响巨大,逐渐成为构建动态网站和应用程序的主要技术架构,据 W3C 的统计,全球有接近 78% 的 Web 网站是基于 PHP 开发构建的。

值得一提的是,PHP 以其低成本、易用、灵活性和可扩展、繁荣的 Web 技术生态,一度在编程开发领域占据着重要的地位,与 Java 语言并驾齐驱。

而随着移动互联网、云计算、人工智能等新技术的兴起,互联网软件系统变得越来越复杂。大型网站系统对于高并发、可用性的要求也越来越高。Java 相比 PHP 拥有类型安全、更好的性能、多线程连接池技术、更严格的编程规范,并且在服务治理方面拥有更成熟的解决方案和生态。很多技术团队更倾向于使用 Java 构建 Web 系统,而非 PHP。

除此之外,伴随如 Node.js、Golang 等新编程语言的出现,它们在某些方面具有 PHP 不具备的优势,例如静态编译、更好的性能和异步编程。这些编程语言也在蓬勃发展,被越来越多的开发者使用。

虽然 PHP 社区也在不断努力改进语言本身,但 PHP 在某些领域的竞争地位逐渐被其他语言所取代,随着时代的发展,一些重要的网站和应用开始转向其他语言和框架,这导致了一些人对 PHP 的未来产生了质疑,很多开发者认为 PHP 正在走向没落。近期 TIOBE 最新指数显示,PHP 的流行度降至了第 17 名,也说明了这一点,开发者正在对 PHP 失去信心,转向其他编程语言。

二、PHP流行度下降的原因

外因是时代的变化,互联网的热潮已退去,现在是人工智能的时代,Python 现在是最流行的编程语言,其他的编程语言的关注度都在下降。内因有以下 3 个:

● PHP 生态过于单一,没有在 Web 之外进入新的领域;

● PHP 语言在类型系统、编译器、并发编程方面迭代更新力度不够,没能及时赶超 Java、Golang、JavaScript(v8) 这些语言和技术;

● 解决历史包袱的魄力不足,至今依然保留着 20 年前的包袱,例如 $_GET/$_POST 等超全局变量、混乱的函数命名等。

尽管如此,PHP 仍然是一门不错的编程语言技术,许多网站和 Web 应用仍然在使用它。PHP 社区和开发者们也在不断努力改进 PHP,使其能够适应新的技术趋势和市场需求,尽管可能会经历了一段时间的没落,但 PHP 仍然会在编程开发领域中扮演着重要角色,这无疑得益于其强大的生态系统。

三、PHP编程语言生态

其实,生态对于编程开发的重要性是不可忽视的,包括开发工具、库、框架、社区、文档、教程、第三方服务和支持等。生态系统的健康与发展直接影响着开发者的工作效率、项目的成功和技术的发展。

在我看来,PHP 只在 Web 开发领域是很成熟的,而 Java 在桌面软件、Android、大数据、金融系统、电商平台均有成熟的生态。Python 在数据科学、人工智能、机器学习、科学计算、教育等领域有广泛应用,尤其是随着 AI 时代的到来,Python 成为当下最为炙手可热的技术。Golang 云原生、基础服务器端软件方面取代了 C/C++。而 Node.js 在前端、单页面应用(SPA)、全栈开发方面具备优势。

相比之下 PHP 的生态非常单一,这也使得 PHP 的局限性尤为明显。而似乎 PHP 官方团队似乎对于 Web 开发之外的生态支持兴趣不大,主要的版本更新也依然是围绕着 PHP-FPM/Apache 这样的 Web 服务器进行着。

不过幸好 PHP 社区有 Swoole 这样类似于 Golang 的异步协程方案,从而弥补了 PHP 在异步并发编程、网络通信方面的一些不足。Swoole 的引入也为开发者提供了更多选择和灵活性,使他们能够更好地应对复杂的应用场景和高并发需求。此外,在软件开发过程中,良好的工程规范也是保证项目质量和开发效率的又一关键要素。

四、工程规范更重要

随着项目研发的经验越来越多,我深刻体会到工程规范比开发的速度更重要。良好的工程规范能够确保项目的长期可维护性、可扩展性和稳定性,虽然追求快速开发可能在短期内带来一些优势,但长期来看,缺乏规范的项目可能会面临诸多问题,包括但不限于以下这些:

● 代码质量下降:没有规范的代码往往会变得混乱、难以理解和维护,使得团队成员在开发、调试和修改代码时耗费更多的时间和精力;

● 团队协作困难:缺乏规范的项目往往意味着每个开发者都有自己的编码风格和习惯,这会导致团队协作时的不一致性和沟通困难;

● 代码可读性差:规范的代码更易于阅读和理解,有助于开发者快速定位问题、理解代码逻辑和进行代码审查;

● 维护成本增加:缺乏规范的代码往往会增加项目的维护成本,因为开发者需要花更多的时间和精力来理解和修改代码,从而增加了项目的技术债务;

● 项目演进困难:随着项目规模的扩大和需求的变更,缺乏规范的代码可能会变得越来越难以维护和扩展,甚至需要重构或重写部分代码。

若我们不重视工程规范,随着项目持续时间的增加,将会造成严重的后果,甚至导致项目研发停滞。而 PHP 社区有很多优秀的项目,可以帮助项目提高工程规范:

● phpunit:单元测试框架;

● composer:包依赖管理器;

● PSR:是社区制定的一系列 PHP 编码规范,涵盖了自动加载、编码风格、命名规范、接口设计等方面;

● php-cs-fixer:代码自动格式化工具;

● phpstan:静态分析检查工具;

● rector:语言版本兼容性检查工具,若项目要升级 PHP 版本可以使用它。

● php-parser:PHP AST 抽象语法树解析工具,可以分析 PHP 语法,做些安全检查、漏洞扫描、编程语言转换,例如 phpy 项目 py2php 就是用它实现的。

不过从编程语言的角度上,PHP 相比 Java 在规范上存在一些天然的缺陷,早期甚至连 namespace 都不支持,面向对象的特性支持也不够完整。虽然在 PHP7 版本做了大量改进,但最新的 PHP 依然存在以下的问题:

(一)无法实现彻底的严格类型

严格类型更容易写出工程规范的代码。这一点基本上是开发者之间的广泛共识。弱类型编程基本上就是 “开发一时爽,重构火葬场”。

现在的 PHP 其实已经在大部分语法上支持了类型限定,例如:

1、函数参数和返回值

function fun(int $a, float $b, FunClass $c, string $d, callable $e): bool {
    // code ...
}

2、对象属性

class FunClass {
    public int $age;
    public string $name;
    public stdClass $attrs;
}

在开发中也建议启用严格模式:

<?php
declare(strict_types=1);

但遗憾的是在 PHP 最常用的数组依然是一个类型黑洞:

$a1 = new FunClass;
$array = [$a1];
$a2 = $array[0];

由于 PHP 的数组是无类型的,将有严格类型的变量存入数组后再取出就出现了类型的丢失。这也是为什么 Facebook 实现的 HHVM 最终选择不再兼容 PHP,而是独立为一门新的语言 Hack,在 Hack 语言中实现了彻底的严格类型。

(二)缺少二进制构建支持

一个软件开发完整流程包括开发、测试、构建、部署运行,Java 和 Golang 这样的静态语言是比较好的,软件开发测试完成发布版本后,应用程序将构建为一份二进制程序,分发和部署不再需要源码。而 PHP 大部分是直接部署源码运行的,就导致出现了一些列问题:

● WebShell 注入,通过上传或其他文件写入的攻击行为,将部分有害代码注入系统中;

● 直接在线上修改 PHP 源代码文件,导致了实际服务器上的代码与 Git 仓库中的代码不一致;

● 部署系统的难题,碎片式更新,导致了部署期间出现各种逻辑错误;

● 源代码泄露

虽然现在很多开发者使用 Docker 镜像构建和部署,解决了一些问题。但PHP 依然存在一些不足,很多上古时期的 PHP 开发者认为热更新是 PHP 的优势,实际上热更新只在开发测试环境中有价值,线上部署运行的服务是不会热更新的,而且 PHP 的核心开发者们,依然顽固地坚持着热更新这个特性。

(三)混乱的内置函数命名

PHP 语言内置的函数全部是在根命名空间内的,并且部分内置函数的命名规范还是错误的,例如:

● htmlspecialchars,多个字母直接拼在一起,正确的应该是:html_encode_special_chars

● strstr, substr, str_replace 等字符串相关函数,命名相当混乱,而数组操作相关函数的命名就规范多了,均是 array_* 这样命名

(四)混乱的参数顺序

内置函数的参数顺序非常混乱,以数组操作函数为例,array_search 和 array_filter,分别是搜索数组是否存在一个元素,后者是从数组筛选出一些符合条件的元素。

array_filter($array, $callback);
arary_search($value, $array);

因为数组本身不是始终为第一个参数,所以导致开发者无法记忆,每次都需要去看文档,以确定参数在前还是在后。

五、PHP语言还值得学习吗?

尽管如此,我认为 PHP 语言还是值得学习的,相比现在主流的编程语言 Java、Python、C++,以及流行的 Node.js、Rust、Golang 等新型编程语言,PHP 有其无法被取代的独特优势,是一个非常便捷的开发工具集,可以帮助开发者节约很多时间。

(一)语言的简单性

首先,PHP 相较于大多数编程语言来说,没有太复杂的语法,不像某些编程语言,有些语法实在难以理解,比如 C++ 的 move/forward(这在 C++ 中还算是比较简单的,C++ 甚至有语言律师这个职业)。

其次,它不需要考虑整型溢出、符号之类的问题,C++ 或 Golang 中的 int8/int16/int32/int64/uint8/uint16/uint32/uint64。

再者,它没有指针的概念,也不会遇到 Java 和 Golang 的空指针异常这类开发者头痛的问题。

同时,它也没有 Python 中各种眼花缭乱的语法,或 JavaScript 中 0 和 []、'\t'、'0' 三位一体的烧脑问题。

综上,客观来说 PHP 语言就是一种朴实无华,入门友好的编程语言,加上它比较简单,学习的成本极低。

(二)庞大的函数库

PHP 语言自带一个庞大的函数库,各种功能应有尽有。这些函数库涵盖了各种各样的功能和用途,让开发者能够更轻松地实现各种软件功能,包括字符串、数组、日期、数学、正则表达式、JSON、XML、文件操作、邮件、网络通信、数据库操作、密码、加密、图像处理、终端和进程管理、国际化与字符编码支持等等。

相比其他语言,需要自己编写很多代码去实现一个功能,或者依赖各种第三方库实现,PHP 就直接可以用内置函数实现。例如:

1、版本比较

要比较两个格式为x.y.z的版本号哪个更高,可以使用 version_compare

var_dump(version_compare('1.9.2', '1.10.0'));
var_dump(version_compare('1.10.0', '1.9.20'));

2、 通配符计算

var_dump(fnmatch('*.qq.com', 'qqcloud.com'));
var_dump(fnmatch('*.qq.com', 'im.qq.com'));

3、路径计算

获取一个文件路径字符串的目录、扩展名、文件名

$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
 
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n";

还有一个更有趣的扩展库,可以在 PHP 中直接调用 Python 中的函数,借此 PHP 也可以直接使用 PyTorch、TensorFlow 等 AI 库,运行 AI 大模型推理、训练,调用 transformers、Paddle NLP、modelscope 的 AI 能力

https://github.com/swoole/phpy

4、transformers

$transformers = PyCore::import('transformers');
 
$os = PyCore::import('os');
$os->environ->__setitem__('https_proxy', getenv('https_proxy'));
 
$distilled_student_sentiment_classifier = $transformers->pipeline(
    model: "lxyuan/distilbert-base-multilingual-cased-sentiments-student",
    top_k: null,
);
 
$rs = $distilled_student_sentiment_classifier ("I love this movie and i would watch it again and again!");
var_dump(PyCore::scalar($rs));

5、modelscope

$pipeline = PyCore::import('modelscope.pipelines')->pipeline;
$Tasks = PyCore::import('modelscope.utils.constant')->Tasks;
 
$pipe = $pipeline($Tasks->ocr_recognition, model: 'damo/cv_convnextTiny_ocr-recognition-general_damo');
$file = '/tmp/captcha.png';
file_put_contents($file, file_get_contents($captcha_url));
echo '识别结果:' . $pipe($file)['text'][0], PHP_EOL;

6、paddle NLP

$pprint = PyCore::import('pprint')->pprint;
$Taskflow = PyCore::import('paddlenlp')->Taskflow;
 
$schema = new PyList(['时间', '选手', '赛事名称']);
$ie = $Taskflow('information_extraction', schema: $schema);
$pprint($ie("2月8日上午北京冬奥会自由式滑雪女子大跳台决赛中中国选手谷爱凌以188.25分获得金牌!"));

7、 gradio client

作为 Gradio 客户端,调用 AI 模型的能力

$gradio_client = PyCore::import('gradio_client')->Client;
$client = $gradio_client("http://192.168.1.146:8088/");
$result = $client->predict("Hello!!", api_name: "/predict");
PyCore::print($result);

强大的字符串处理能力

各种常用的编程语言中 PHP 的字符串处理能力是最强大的,没有之一。PHP 除了是一个编程语言之外,还是一个模版语言。可以直接在模版中嵌入 PHP 表达式,使用起来甚至比 Vue 或 React JSX 模版更强大。

注意:缺点只是不能在浏览器中运行

例如下面的代码,可以模版中使用任意 PHP 语法,没有任何限制:

var json = <?= json_encode($data) ?>;
 
<?php foreach($lines as $line): ?>
    document.write(<?=$line?>);
<?php endforeach; ?>

六、PHP的未来发展趋势

自从 PHP 基金会成立后,它每年可以收到上百万美金的捐助,PHP 语言官方开发团队的贡献也越来越稳定。很多编程语言的问题,相信可以在未来都能得以解决。

以 Laravel、Symfony 为代表的 PHP 框架现在也越来越成熟,逐渐拉近了与 Java Spring 框架的距离。而协程扩展项目 Swoole 在今年也推出了 v6.0 的计划,为 PHP 引入了多线程+协程的并发编程方案。

除此之外,PHP 社区中还诞生了很多有趣的新项目,例如:

● RoadRunner

● nativephp

● frankenphp

● phpy

结语

总而言之,在我看来,PHP 语言整体发展仍是稳中向前,在未来重新流行起来也是极有可能的。最后,我也分别给企业和开发者们一些可供参考的建议。

首先,对于企业选型 PHP 来说,在数千万甚至上亿用户活跃的大型 Web 系统中,PHP 技术栈可能会面临各种挑战和难题,使用 Java 或 Golang 可以容易获得更好的性能、工程规范、高并发和高可用性、更成熟的服务治理方案。但绝大部分项目不会有如此大规模的用户量级和复杂度,使用 PHP 技术栈的开发团队依然是比较有性价比的选择。研发团队可以以较少的人力资源投入保持更快的迭代速度,在当下开源节流的大趋势下尤为重要。

其次,对于 PHP 开发者们而言,第一,我们要学习 AI,使用 ChatGPT、Github Copliot 等工具提升自己的开发效率,了解 Transformers 等大模型的原理;第二,我们可以使用 Docker 镜像和 Docker Swarm 容器编排工具、Docker Compose 实现本机的容器启动管理;第三,我们也要掌握 Vue/React/ElementUI 等前端技术栈,要具备全栈开发的能力;最后,学习 C++/Golang/Java 等其他编程语言技术,不仅仅局限于 PHP 一种编程语言也是十分必要的。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/636508.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

JS Navigator.sendBeacon 可靠的、异步地向服务器发送数据

JS Navigator.sendBeacon 可靠的、异步地向服务器发送数据 前言 我们在上一篇页面访问&页面关闭数据上报的文章中使用了 sendBeacon 方法用来发送数据&#xff0c;上篇文章是简单使用&#xff0c;那本篇文章我们就详细了解下这个东西。 一、Navigator.sendBeacon 是什么…

算法2:滑动窗口(上)

文章目录 长度最小子数组无重复字符的最长子串[最大连续 1 的个数III](https://leetcode.cn/problems/max-consecutive-ones-iii/description/)将x减到0的最小操作数 长度最小子数组 class Solution { public:int minSubArrayLen(int target, vector<int>& nums) {in…

SAP---成本中心采购跟消耗性采购的区别

1.常规库存采购业务的说明&#xff1a; 1.从业务层面分析&#xff0c;企业的常规库存物料采购是&#xff1a; 采购部门下采购订单后&#xff0c;供应商送货&#xff0c;当货物到厂后&#xff0c;由库管员执行收货操作&#xff0c;先将货物收到仓库中&#xff0c;再由各个需求…

APP广告变现,开启你的APP盈利新纪元

随着科技的飞速发展&#xff0c;智能手机已经成为了我们生活中不可或缺的一部分。而在这个数字化时代&#xff0c;APP应用更是如雨后春笋般层出不穷&#xff0c;为我们的生活带来了极大的便利。然而&#xff0c;对于APP开发者来说&#xff0c;如何在激烈的市场竞争中脱颖而出&a…

智能的PHP开发工具PhpStorm v2024.1全新发布——支持PHPUnit 11.0

PhpStorm是一个轻量级且便捷的PHP IDE&#xff0c;其旨在提高用户效率&#xff0c;可深刻理解用户的编码&#xff0c;提供智能代码补全&#xff0c;快速导航以及即时错误检查。可随时帮助用户对其编码进行调整&#xff0c;运行单元测试或者提供可视化debug功能。 立即获取PhpS…

Docker Portainer使用

Portainer是什么 Docker Portainer是一个轻量级的 Web UI 管理界面,可以用来管理Docker环境。它提供了一个直观的控制台,用户可以通过它来管理Docker主机、容器、网络、卷等Docker资源。 Portainer的主要功能和特点包括: 容器管理:可以查看、启动、停止、删除容器,以及查看容器…

SpringBoot中使用AOP实现日志记录功能

目录 一、SpringBoot框架介绍 二、什么是 AOP 三、日志记录的必要性 四、SpringBoot中如何使用AOP实现日志记录功能 一、SpringBoot框架介绍 SpringBoot是一个开源的Java开发框架&#xff0c;旨在简化基于Spring框架的应用程序的开发。它提供了一套开箱即用的工具&#xf…

WebGL的医学培训软件开发

开发基于WebGL的医学培训软件是一项复杂且技术性强的任务&#xff0c;需要结合医学专业知识和计算机图形学技术。以下是详细的开发流程和关键步骤。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作。 1.需求分析与定义 目标用户&#xf…

【C语言】——函数栈帧的创建与销毁

函数栈帧的创建与销毁 本文主要讲解了函数调用过程中其栈帧的创建与销毁&#xff0c;内容干货较多&#xff0c;希望大家认真品味。 使用C语言进行函数调用时&#xff0c;是否会有很多疑问&#xff1a; 1.局部变量是如何创建的&#xff1f; 2.局部变量在未初始化的情况下&#x…

从ES5迈向ES6:探索 JavaScript 新增声明命令与解构赋值的魅力

个人主页&#xff1a;学习前端的小z 个人专栏&#xff1a;JavaScript 精粹 本专栏旨在分享记录每日学习的前端知识和学习笔记的归纳总结&#xff0c;欢迎大家在评论区交流讨论&#xff01; ES5、ES6介绍 文章目录 &#x1f4af;声明命令 let、const&#x1f35f;1 let声明符&a…

代码生成器(一)---项目概述以及项目初始化

目录 一、项目概述 1.代码生成器解决的问题 2.代码生成器的实际应用 3.本地代码生成器的业务流程 4.实现思路 二、项目初始化 项目Gitee地址&#xff1a;Code-Generator: 代码生成器&#xff01;&#xff01;&#xff01; 一、项目概述 1.代码生成器解决的问题 代码生成器本…

使用vue和element_ui搭建后端页面

使用vue和element_ui搭建后台管理页面 效果顶部和左侧内容固定&#xff0c;中间内容滚动 <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"&g…

地理信息系统(GIS)软件开发

地理信息系统&#xff08;GIS&#xff09;软件开发是一项复杂且系统性很强的工程&#xff0c;涉及空间数据的采集、管理、分析和展示。以下是一个典型的GIS软件开发流程&#xff0c;包括各个步骤的详细说明。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#…

2024电工杯B题食谱评价与优化模型思路代码论文分析

2024年电工杯数学建模竞赛B题论文和代码已完成&#xff0c;代码为B题全部问题的代码&#xff0c;论文包括摘要、问题重述、问题分析、模型假设、符号说明、模型的建立和求解&#xff08;问题1模型的建立和求解、问题2模型的建立和求解、问题3模型的建立和求解&#xff09;、模型…

【STL专题】深入探索C++之std::string:不止于字符串【万字详解】

欢迎来到CILMY23的博客 &#x1f3c6;本篇主题为&#xff1a;深入探索C之std::string&#xff1a;不止于字符串 &#x1f3c6;个人主页&#xff1a;CILMY23-CSDN博客 &#x1f3c6;系列专栏&#xff1a;Python | C | C语言 | 数据结构与算法 | 贪心算法 | Linux &#x1f3…

Nginx - 一键实现Nginx的快速安装和优化配置

文章目录 思路实现二次优化 思路 初始化下载工具目录并下载依赖&#xff1a; 创建临时目录 /tmp/tools。下载 OpenSSL、PCRE 和 Zlib 的压缩包。解压这些依赖包到指定目录。 设置NGINX的用户和脚本&#xff1a; 添加 nginx 用户。创建目录和启动、停止、重载NGINX的脚本。 安装…

如何异地组网添加摄像机?

本文将介绍如何使用天联技术实现异地组网添加摄像机&#xff0c;并保障数据的安全性。 安防摄像机的应用愈发广泛&#xff0c;无论是家庭安防还是企业监控&#xff0c;摄像机都扮演着重要角色。在一些特殊场合或者特殊需求下&#xff0c;我们需要将摄像机添加到异地网络中进行监…

Web开发——HTMLCSS

1、概述 Web开发分前端开发和后端开发&#xff0c;前端开发负责展示数据&#xff0c;后端开发负责处理数据。 HTML&CSS是浏览器数据展示相关的内容。 1&#xff09;网页的组成部分 文字、图片、音频、视频、超链接、表格等等 2&#xff09;网页背后的本质 程序员写的前端…

神经网络基础结构

1. 神经网络 在神经网络中&#xff0c;每个神经元都有一个与之关联的权重和偏置&#xff0c;它们用于计算神经元的输出值。神经元接收来自上一层神经元的输入&#xff0c;并将这些输入与权重相乘并加上偏置&#xff0c;然后通过激活函数进行非线性处理&#xff0c;最终产生输出…

Qt案例练习(有源码)

项目源码和资源&#xff1a;Qt案例练习: qt各种小案例练习,有完整资源和完整代码 1.案例1 项目需求&#xff1a;中间为文本框&#xff0c;当点击上面的复选框和单选按钮时&#xff0c;文本框内的文本会进行相应的变化。 代码如下&#xff1a; #include "dialog.h" …