两道PHP体算法题,不懂,请路过的大神帮忙阐述一下原理
if中使用"="号的赋值操作
看等号左侧值最终的值来进行判断
if($a = $b) {
// ...
}
若$b值为false、null、''、[]、0等值时,以上无法进入block代码块
你也可以把上面的代码理解为如下
$a = $b;
if($a) {
// ...
}
1 回答3.3k 阅读✓ 已解决
1 回答4.1k 阅读✓ 已解决
3 回答1.9k 阅读✓ 已解决
2 回答2.3k 阅读✓ 已解决
2 回答749 阅读✓ 已解决
1 回答1.4k 阅读✓ 已解决
2 回答2.3k 阅读
问题1 执行结果为:
1
问题2 执行结果为:
bool(true)
原理解释如下:
关键词:
PHP 运算符的优先级
递增/递减运算符规则
演示版本:
PHP-5.6
原理分析角度:
PHP源码
/++操作符源码
PHP 运算符的优先级
如上所示,
||
优先级 高于=
,所以||
返回的结果true
(boolean
类型) 复制给了变量左操作数(如题中的变量$a
)。而赋值表达式的返回结果为左操作数的值,所以这两处可以满足
if
条件。参考:运算符优先级
++ 运算符的计算规则
从
PHP 手册
上我们可以看到++
运算符对boolean
类型变量无效,所以问题1
中的echo
结果为1
,var_dump
结果为bool(true)
。至此,我们已经明白了这两段代码片段有这样结果的原因了。
PHP 源码角度分析 ++ 操作符实现逻辑
(以
问题1
为例)1. 利用 vld 查看 此段代码的 opcode
opcode
结果如下:定位第七行代码,我们可以看到
++
操作:opcode
为PRE_INC
操作数类型
为IS_CV
(篮筐内容)2. 从 PHP 源码 角度分析 ++ 操作符
参考:PHP-5.6 源码
2.1 词法分析
文件:
Zend/zend_language_scanner.l +1343
如图示:
++
操作符所对应的Token
为:T_INC
2.2 语法分析
文件:
Zend/zend_language_parser.y +795
如图示:通过
T_INC
我们在语法解析文件中定位到了++
操作符所对应的语法解析规则。我们可以得到:
zend_do_pre_incdec
opcode
:ZEND_PRE_INC
分析
zend_do_pre_incdec
方法,及根据opcode
所对应的zend_vm
处理方法,我们可以知道,最终opcode
在zend_vm
中执行时,所调用的方法是ZEND_PRE_INC_SPEC_CV_HANDLER
(此处根据opcode
(ZEND_PRE_INC
) 和++
操作数类型IS_CV
判断)。查看
ZEND_PRE_INC_SPEC_CV_HANDLER
方法,源码如下:我们可以看到,此次调用最终会执行

fast_increment_function
方法。继续跟进
fast_increment_function
方法我们会发现调用了
increment_function
,此方法源码如下:我们传入的操作数类型(
boolean
)不满足所有的case
,所以逻辑走到了default
而最终执行了return FAILURE;
,再根据函数调用栈返回,我们发现没有对操作数做任何递增处理。结论
此时,我们可以得出最开始的结论:
(当然
递减
操作符分析同理)