显示php中的所有计算步骤
是否有可能显示php如何计算问题的解决方案.
例如: <?php $equation = (5+1)*3/9; // outputs 2 ?> 如果希望看到它处理的所有步骤都来到该解决方案: (5 1)= 6 6 * 3 = 18 18/9 = 2 解决方法
PHP脚本解析器&抽象语法树(AST) 原因是,PHP在内部使用抽象语法树(AST)来定义处理步骤以及通过创建更好的二进制表示作为OpCache来优化执行,以避免一次又一次地解析和处理相同的脚本. 因此,如果您需要了解有关PHP中的处理的更多信息,您可以考虑分析PHP C源代码: > AST基础知识:https://github.com/php/php-src/blob/856b63a632c90c0c23ac49b8e51d5e0b45cb0c4a/Zend/zend_ast.c >例如搜索AST文字,如ZEND_ADD,ZEND_SUB,ZEND_MUL,ZEND_DIV >操作符执行:https://github.com/php/php-src/blob/856b63a632c90c0c23ac49b8e51d5e0b45cb0c4a/Zend/zend_operators.c >例如搜索add_function,sub_function,mul_function,div_function PHP脚本中的AST – nikic / php-parser 也可以在PHP中重新实现AST解析器,参见https://github.com/nikic/PHP-Parser. 以下示例将表达式$equation =(5 1)* 3/9; //将原始问题的2个输出到专用的math.php文件.使用以下CLI命令执行解析器: composer require nikic/php-parser vendor/bin/php-parse math.php 这将输出$equation =(5 1)* 3/9的解析语法树; //输出2(基本上是原问题的答案): ====> File math.php: ==> Node dump: array( 0: Stmt_Expression( expr: Expr_Assign( var: Expr_Variable( name: equation ) expr: Expr_BinaryOp_Div( left: Expr_BinaryOp_Mul( left: Expr_BinaryOp_Plus( left: Scalar_LNumber( value: 5 ) right: Scalar_LNumber( value: 1 ) ) right: Scalar_LNumber( value: 3 ) ) right: Scalar_LNumber( value: 9 ) ) ) ) 1: Stmt_Nop( comments: array( 0: // outputs 2 ) ) ) OpCache analyzis 通过阅读https://nikic.github.io/2017/04/14/PHP-7-Virtual-machine.html(由上面提到的PHP AST解析器的作者),人们可能会发现有关分析PHP处理的更多信息.但是,本节没有给出问题的其他答案 – 更多的是概述替代方案以及它们实际揭示的内容. php -d opcache.enable_cli=1 -d opcache.opt_debug_level=0x10000 math.php 在CLI上下文中执行的上述命令启用OpCache调试并输出以下内容: $_main: ; (lines=3,args=0,vars=1,tmps=1) ; (before optimizer) ; /var/www/developer/math.php:1-4 L0: EXT_STMT L1: ASSIGN CV0($equation) int(2) L2: RETURN int(1) 上面的调试输出只包含结果int(2),但不包含已为语法树确定的相应步骤 – 这非常明显,因为它们不是优化版本所必需的. 这可以通过查看生成的OpCache二进制文件来验证: php -d opcache.enable_cli=1 -d opcache.opt_debug_level=0x10000 -d opcache.file_cache=/var/www/developer/opcache/ -d opcache.file_cache_only=1 math.php hexdump opcache/08202de11af2c60edca0b5438eeefab6/var/www/developer/math.php.bin -C (我的工作目录是/ var / www / developer /,它有一个子目录opcache /) 00000210 2f 76 61 72 2f 77 77 77 2f 64 65 76 65 6c 6f 70 |/var/www/develop| 00000220 65 72 2f 6d 61 74 68 2e 70 68 70 00 75 7f 00 00 |er/math.php.u...| 00000230 28 32 60 aa 75 7f 00 00 30 32 60 aa 75 7f 00 00 |(2`.u...02`.u...| 00000240 38 32 60 aa 75 7f 00 00 40 32 60 aa 75 7f 00 00 |82`.u...@2`.u...| 00000250 02 00 00 00 00 00 00 00 04 00 00 00 ff ff ff ff |................| <-- 00000260 01 00 00 00 00 00 00 00 04 00 00 00 ff ff ff ff |................| 00000270 e9 0b 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................| 00000280 00 00 00 00 00 00 00 00 02 00 00 00 65 08 08 08 |............e...| 00000290 e9 0b 00 00 00 00 00 00 50 00 00 00 00 00 00 00 |........P.......| 000002a0 00 00 00 00 00 00 00 00 02 00 00 00 26 10 01 08 |............&...| 000002b0 e9 0b 00 00 00 00 00 00 10 00 00 00 00 00 00 00 |................| 000002c0 00 00 00 00 ff ff ff ff 04 00 00 00 3e 01 08 08 |............>...| 000002d0 88 02 00 00 00 00 00 00 00 00 00 00 06 02 00 00 |................| 000002e0 cb 5b 29 c4 00 e7 1a 80 08 00 00 00 00 00 00 00 |.[).............| 000002f0 65 71 75 61 74 69 6f 6e 00 32 60 aa 75 7f 00 00 |equation.2`.u...| 上面的hexdump只显示了OpCache文件的结尾.标记行中的第一个字节(位于0x00000250)已包含优化结果02.对于给定的示例,没有其他指向运算符的指针(例如ZEND_MUL),也没有整数文字5,1,3或9.因此,常数方程的结果已经直接存储在OpCache中. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |