PHP フロー制御文と条件判定におけるデータ型変換
PHPのフロー制御文には、ループ本体文と分岐判定文が含まれます。
ループ操作には、while、do-while、for ループという 3 つのステートメント グループが含まれます。
分岐判定本体には、if else文とswitch文の2つのグループが含まれます。
以下は、PHP のフロー制御ステートメントにおけるデータ型変換と条件判断を理解するためのいくつかの質問です。
********************************************** *****
質問 1. if-else 文と条件判断に伴うデータ型変換
********************************************** *****
<?php /*习题*/ /*1。写出下列代码的运行结果*/ if(5<4) echo "true"; else echo "false-1"."<br />"; if("0") echo "true"; else echo "false-2"."<br />"; if($i) echo "true"; else echo "false-3"."<br />"; if("false") echo "true"; else echo "false-4"."<br />"; if(false) echo "true"; else echo "false-5"."<br />"; if(0.0) echo "true"; else echo "false-6"."<br />"; if(php) echo "true"; else echo "false-7"."<br />"; if("") echo "true"; else echo "false-8"."<br />"; if(null) echo "true"; else echo "false-9"."<br />"; if(array(12)) echo "true"; else echo "false-10"."<br />"; if(array()) echo "true"; else echo "false-11"."<br />"; /* 输出结果: false-1 false-2 false-3 true false-5 false-6 true false-8 false-9 true false-11 分析:if语句当条件不满足(即条件表达式计算结果为false)都会返回假。php的if语句没有then,有elseif(同else if) 当转换为boolean时候,以下值被认为是false: 1)布尔值false; 2)整型值0(零); 3)浮点型值0.0(零); 4)空白字符串和字符串“0”; 5)没有成员变量的数组; 6)没有单元的对象(仅适用于PHP4); 7)特殊类型NULL(包括尚未设定的变量); */ ?>
********************************************** *****
質問 2. switch-case-default ステートメントと Break ステートメントの関係
********************************************** *****
<?php /*2。写出下列代码的运行结果*/ $a = "linux"; switch($a){ //echo "hello"; case 'lamp': echo "one"; break; case php: echo "five"; break; case 'linux'://用不用引号均可 echo "six"."<br />"; case 6: echo "??"; case '8': echo "|||"; case 10: echo "10"."<br />"; break;//如果去掉此break将输出default分支的@@ default: echo "@@"; break; } /* 运行结果为: six ??|||10 分析:请注意以上switch-case-default语句中,有的地方是没有break语句的。 ①default在所有case开关中,总是最后执行。 ②一旦switch的条件判断进入了一个开关(包括default),如果这个开关里面没有break跳出语句,则这个开关之后的语句被当做普通程序语句来执行,直到遇到break为止(比如:如果条件满足了case 2开关,而case 2开关里面没有break语句,则case 2之后的语句被当做普通程序语句执行,case判断不再有效。)。而如果进入的这个开关里面有break语句,则执行完之后就跳出switch。 ③当前一语句的case语句为空时候,控制器自动转移到下一case语句。 由此可见,使用switch的时候,如果case里面没有break,这个程序是相当危险的,这其中潜伏着的漏洞即使经验丰富的测试人员也可能很难发现。 参考w3school的解释: 工作原理: 1、对表达式(通常是变量)进行一次计算 2、把表达式的值与结构中 case 的值进行比较 3、如果存在匹配,则执行与 case 关联的代码 4、代码执行后,break 语句阻止代码跳入下一个 case 中继续执行 5、如果没有 case 为真,则使用 default 语句 */ ?>
********************************************** *****
質問 3、switch-case-default ステートメントとデータ型の自動変換
********************************************** *****
<?php /*3。写出下列代码的运行结果*/ $a = "abc"; switch ($a) { case 0: echo "a 为 0"; break; case "cdef": echo "a 为 cdef"; break; case "abc": echo "a 为 abc"; break; default: echo "a 什么都不是"; break; } /*输出结果:a 为 0 分析: 这个问题应该从PHP作为动态脚本语言说起: 动态语言的变量类型是随存储的变量而变化的,即变量类型是根据具体环境而进行变化的。 字符串"abc",从表面来看可能指确切字符串,但是对于PHP存储的时候它是不能确定的,因为随着语义的变化,其所起的作用也会变化 第一个case 0:,PHP脚本将常量0解释为确切的整数,与字符串比较大小时,需要将字符串转换为整数。PHP脚本解释器会自动将字符串abc,从十进制(默认)转换为数字,但是abc很明显不能代表十进制数,即转换失败,此时PHP将结果置为0,如果将字符串表示为"0xabc",那么PHP脚本能够发现0x标识,将abc作为十六进制转换,所以能够得到abc标识的十六进制整数。 如果学过C语言,可以做一个简单比较: C中的case必须是数字常量,而不能是字符串,就因为C是变量类型确定的,运行时不能将确定的变量按语义随意转换。而PHP可以,因为PHP语言是动态的,变量类型是动态的。 或者从PHP的例子中学习: 如果一个文件将111111字符串(不是数字)存储到文件,然后从文件直接读取到变量$a,如下语法就可以将$a作为整数计算:0+$a 上述表达式得到的结果也可以作为动态语言的一个变现来看 */ ?>
********************************************** *****
質問 4: プログラミングの省略と間違いやすい点 - 比較演算子と代入演算子の違い
********************************************** *****
<?php /*4。写出下列代码的运行结果*/ if($i = ""){ echo "a"; } else { echo "b"; } /* 输出结果:b 这里的条件表达式不是比较运算符==,而是赋值运算符=,显然,空字符串和字符串0都为false。 */ ?>
上記の 4 つの例を通して、PHP の基本文法を前提とした PHP 言語の使用規則、特に PHP のフロー制御文と条件判断におけるデータ型変換について、より深く理解することができます。この知識を習得すると、コーディングの良い習慣を身につけ、現実の罠を回避し、開発効率を向上させることができます。