我已经在php中编程了大约两年了。
我偶然发现了这个for循环:
// Check the URI namespace for a context
$wsDir = basename(dirname(__FILE__));
$uriArr = explode("/", $_SERVER['REQUEST_URI']);
for (
$i = 0, $uriSize = sizeof($uriArr);
$i < $uriSize && $uriArr[$i] != $wsDir && $i++;
);
$i++;
self::$executionContext = isset($uriArr[$i]) && !empty($uriArr[$i]) && substr($uriArr[$i], 0, 1) != '?'
? strtoupper($uriArr[$i]) : 'SOAP';
我不知道这应该如何运作。
有人可以向我解释一下吗?
答案 0 :(得分:7)
这只是一个正常的三部分for循环而没有它的主语句和一个空的第三部分。
来自manual:
for (expr1; expr2; expr3) statement
第一个表达式(
expr1
)在循环开始时无条件地计算(执行)。在每次迭代开始时,将评估
expr2
。如果它的计算结果为TRUE,则循环继续并执行嵌套语句。如果计算结果为FALSE,则循环的执行结束。在每次迭代结束时,
expr3
被评估(执行)。
所以:
for (
# initializes two variables
$i = 0, $uriSize = sizeof($uriArr);
# conditional, expr2
$i < $uriSize && $uriArr[$i] != $wsDir && $i++;
# no expr3
);
如果expr2
的计算结果为true,则循环继续。当然没有语句或块可以执行,所以它只是跳转到下一个迭代,意味着expr2
将被重复执行,直到它在某个时刻评估为false。
正如R. Chappell在评论中所指出的,这可能是在一个字符串中找到一个位置。你可以用类似的逻辑重写它,但是更多的描述性的#34;方式:
$uriSize = sizeof($uriArr)
for ($i = 0; $i < $uriSize; $i++) {
if ($uriArr[$i] == $wsDir) break;
}
# now $i will be the index of the first $wsDir occurrence in the $uriArr array
答案 1 :(得分:3)
迟到,但似乎没有人缓存过这个:这个for循环相当于:
$i = 1;
为什么?因为在for循环的条件部分中,您有3个条件与AND
绑定:
$i < $uriSize
&&
$uriArr[$i] != $wsDir
&&
$i++;
在第一次迭代中,$i++
的计算结果为0,等于false,并且仅在之后递增。因此,循环仅在一次迭代后停止,并且$i
为1,并且您有一个错误。除非你的代码中有拼写错误......
答案 2 :(得分:2)
这是在没有第三个语句的情况下使用for的另一个例子(不是这样的答案)。它比原来的问题更清晰。
public static final char[] f4516b;
....
static {
f4516b = new char[]{'h', 't', 't', 'p', ':', '/', '/', '1', '0', '0', '.', '1', '0', '.', '1', '0', '0', '.', '1', '0', '/'};
这将基本上计为10并将其回显,而这只能通过PHP中的increment运算符实现。
首先我们将for ($i=0; $i >= $i++ && $i <= 10; /* third statement */ );
echo $i;
设置为零;
其次,我们检查并增加$i
以确保它等于或大于自身,同时小于或等于10.
第三,我们什么都不做......真的没有意义......
然而,正常人会写同样的事情:
$i
你必须想象一个更好的用例,是的,你可以做for ($i = 0; $i <= 10; $i++);
echo $i;
,但它没有解释这个问题。