新闻详情

新闻详情

首页 / 资讯中心 / 详情

Twig `is odd` 奇偶测试:语法、源码实现与沙箱安全用法详解

发布时间:2026/9/26 7:59:06来源:尧图网络
Twig `is odd` 奇偶测试:语法、源码实现与沙箱安全用法详解
后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载导读odd是 Twig 模板语言内置的一个数值测试test用于判断给定数字是否为奇数。本文以 doc/tests/odd.rst 为骨架结合 Twig 源码中OddTest节点的编译实现、核心扩展注册逻辑与官方集成测试完整讲解{{ var is odd }}的语法、底层求值原理、与even、divisible by的关系、负奇数等边界情况以及它在沙箱sandbox模式下的可用性。读完本文你将能在自己的 Twig 模板中准确、安全地使用奇偶判断。odd测试的语法与基本语义在 Twig 中测试tests通过is操作符与变量结合使用。odd测试的语义非常直观当给定数字是奇数时odd返回true。官方文档 doc/tests/odd.rst 给出的最小示例为{{ var is odd }}该表达式会输出true或falseTwig 中布尔值渲染为1或空字符串实际显示效果取决于输出上下文。同样地odd也可以配合否定形式使用{% if var is not odd %} 数字是偶数 {% endif %}完整可运行的模板示例{% set var 7 %} {{ var is odd ? 奇数 : 偶数 }} {# 输出奇数 #} {% set var 8 %} {{ var is odd ? 奇数 : 偶数 }} {# 输出偶数 #}该测试典型应用于列表分栏、隔行变色、栅格布局奇偶列渲染等需要按序数区分两组的场景{% for item in items %} tr class{{ loop.index is odd ? odd-row : even-row }} td{{ item }}/td /tr {% endfor %}源码级原理OddTest节点的编译实现odd不是一个普通的回调式测试而是 Twig 核心扩展中一个以专属节点类实现的测试。在 src/Extension/CoreExtension.php 中它被注册为new TwigTest(even, null, [node_class EvenTest::class, always_allowed_in_sandbox true]), new TwigTest(odd, null, [node_class OddTest::class, always_allowed_in_sandbox true]),关键点有两个node_class指定专用节点odd由 src/Node/Expression/Test/OddTest.php 处理编译阶段直接生成内联的 PHP 求值代码always_allowed_in_sandbox为true即使开启沙箱模式odd也始终被允许使用详见下文沙箱章节。底层求值取模运算OddTest继承自TestExpression其核心逻辑在compile()方法中见 src/Node/Expression/Test/OddTest.phppublic function compile(Compiler $compiler): void { $compiler -raw(() -subcompile($this-getNode(node)) -raw( % 2 ! 0) -raw()) ; }也就是说模板中的{{ var is odd }}在编译后等价于 PHP 表达式($var % 2 ! 0)即“对 2 取模后不等于 0”。对比来看src/Node/Expression/Test/EvenTest.php 中even的编译结果为(node % 2 0)两者互为镜像odd恰好是even的补集。类型强转约束值得注意的一个细节是OddTest还实现了getStringCoercedChildNames()并返回空数组见 src/Node/Expression/Test/OddTest.php注释明确说明PHP%rejects Stringable with a TypeError, no coercion这意味着由于底层直接使用 PHP 的取模运算符%如果传入一个实现了Stringable可转字符串的对象PHP 会抛出TypeError而不会进行字符串强转。因此odd的入参应当是真正的数值类型模板中应避免把对象或非数值字符串传给该测试。与even、divisible by的关系odd在官方文档中与even测试互为“参见”关系doc/tests/odd.rst 的seealso一节指向 doc/tests/even.rst后者同样回指odd。三者可归纳为测试语义等价表达式odd数字为奇数num % 2 ! 0even数字为偶数num % 2 0divisible by数字可被某数整除num % n 0因此可以推导出以下等价写法{{ var is odd }} {# 等价于 #} {{ var is not even }} {# 等价于 #} {{ var is not divisible by(2) }} {# 若数字为整数 #}三者覆盖了奇偶判断与整除判断的全部常见需求开发者可根据可读性选择最贴切的表达。官方集成测试验证Twig 仓库为odd提供了专门的集成测试用例 tests/Fixtures/tests/odd.test覆盖了正奇数、偶数与负奇数三类输入{{ 1 is odd ? ok : ko }} {{ 2 is odd ? ko : ok }} {{ -1 is odd ? ok : ko }}对应的期望输出为ok ok ok该用例证实了两个事实1判定为奇数、2判定为偶数基础语义正确负数同样参与奇偶判定-1的-1 % 2在 PHP 中结果为-1非 0因此被正确判定为奇数——这也说明基于取模的实现对负数同样成立无需额外的绝对值处理。在 tests/Extension/CoreTest.php 中还可以看到odd被列为 Core 扩展提供的测试之一确认其属于 Twig 核心内置能力开箱即用无需引入任何额外扩展。沙箱模式下的安全性由于odd被注册时显式声明了always_allowed_in_sandbox true见 src/Extension/CoreExtension.php它在沙箱环境中属于白名单默认放行的测试。Twig 的沙箱测试用例 tests/Extension/SandboxTest.php 中即包含yield [{{ 3 is odd ? y }}];这表示在启用沙箱的模板里{{ 3 is odd ? y }}仍可正常求值不会被安全策略拦截。这一点对在沙箱中渲染用户提交模板的场景很重要奇偶判断属于纯数值运算不涉及方法调用、属性访问或任何外部副作用因此被设计为始终允许。实用小结{{ var is odd }}返回true当且仅当var是奇数底层编译为 PHP 的(var % 2 ! 0)与even互补与divisible by(2)等价对整数而言支持负数判定入参应为数值向Stringable对象传入会触发TypeError属于核心扩展内置测试src/Extension/CoreExtension.php并在沙箱中默认放行官方集成测试见 tests/Fixtures/tests/odd.test可作为行为基准。至此你已完整掌握 Twigodd测试的语法、实现原理与安全边界可以在模板开发与沙箱配置中放心使用。赞分享后端【免费下载链接】TwigTwig, the flexible, fast, and secure template language for PHP项目地址https://gitcode.com/gh_mirrors/tw/Twig点击查看免费下载相关推荐Twig 模板语言 even 测试详解判断偶数的语法、沙箱机制与底层编译原理Twig 模板语言 even 测试详解判断偶数的语法、沙箱机制与底层编译原理 导读 even 是 Twig 模板语言内置的测试Test之一用于判断给定的后端Twig 的 divisible by 测试Test详解用法、语法变体与底层实现Twig 的 divisible by 测试Test详解用法、语法变体与底层实现 divisible by 是 Twig 模板语言内置的测试Test后端Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查Twig column 过滤器详解从一行模板语法到 PHP array_column 与沙箱安全检查 column 是 Twig 核心过滤器之一用于从一个对后端上一篇3种场景解决方案QMCDecode让加密音乐解锁成为可能下一篇深入浅出Per-CPU变量一文看懂Linux内核的多核无锁加速术创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
网站建设高端定制企业官网
RELATED

相关资讯

更多精彩内容,欢迎继续阅读

较早相关资讯

最新相关资讯

Windows全局翻译工具开发实战:划词、截图、剪贴板三大功能解析 2026/9/26 8:42:20

Windows全局翻译工具开发实战:划词、截图、剪贴板三大功能解析

你可以说我有点轴:别人遇到系统不好用,第一反应是找个替代品,我的第一反应是“那我给它写一个”。SnapLingo 就是这么来的——一个 Windows 上的全局翻译软件,只做三件事:划词翻译、截图翻译、剪贴板翻译,外…

阅读更多 →
Claude Code实战:终端里的AI编程引擎,两个月开发效率记录 2026/9/26 8:42:20

Claude Code实战:终端里的AI编程引擎,两个月开发效率记录

不知道你发现没有,过去两年AI编程工具出了不少,但真正让我产生“这玩意儿能干活”的感觉的,是在我把Claude Code跑起来、看它自己定位并修完第一个bug的时候。它不是一个挂在网页端的聊天机器人,而是一个住在终端里的逻辑引擎&…

阅读更多 →
企业级RAG落地指南:PDF解析、Milvus部署与混合检索实战 2026/9/26 8:42:14

企业级RAG落地指南:PDF解析、Milvus部署与混合检索实战

做 RAG 项目最尴尬的阶段,不是大模型回答得不好,而是你的知识库“一问三不知”。很多同学跟着网上的 demo 跑通了一条链路:加载 PDF、切分文本、调用 Embedding 接口、写入向量数据库、去大模型那里做生成。看起来每一步都正常,但…

阅读更多 →
BitLocker脱机状态解析:锁+感叹号不是故障而是安全机制 2026/9/26 8:42:14

BitLocker脱机状态解析:锁+感叹号不是故障而是安全机制

1. 这不是普通磁盘故障:BitLocker加密状态导致的“锁感叹号”现象本质解析你点开磁盘管理(diskmgmt.msc),突然发现某个卷图标上叠着一把小锁,旁边还跟着一个醒目的黄色感叹号——这不是Windows在报错,而是在…

阅读更多 →
企业级RAG落地全路径:Milvus部署、PDF解析到混合检索与Rerank精排 2026/9/26 8:42:14

企业级RAG落地全路径:Milvus部署、PDF解析到混合检索与Rerank精排

先说一下自己在企业知识库项目里反复踩过的坑:PDF 里的表格一解析就乱、检索出来的结果和问题对不上、本地调通的 Milvus 部署到服务器又内存告警,网上资料也零散,很难串成一条完整链路。这篇文章就把企业级 RAG 落地的完整路径整理出来&…

阅读更多 →
Windows 11全角半角切换全攻略:快捷键、故障排查与批量转换 2026/9/26 8:42:14

Windows 11全角半角切换全攻略:快捷键、故障排查与批量转换

1. 全角和半角到底差在哪:不只是"变宽"这么简单先说个我自己的糗事。有一年我帮同事排查一个报表导出的问题,Excel里VLOOKUP死活匹配不上,数据明明一模一样。折腾了半小时,最后发现是她在系统里录入数据时,括…

阅读更多 →

今日资讯

本周资讯

本月资讯

看完文章仍有疑问?

联系尧图顾问,获取一对一建站咨询

立即免费咨询 📞 400-888-8888
📞 ✉