这个PHP代码究竟做了什么?

问题描述:

好吧,我的朋友给了我这个代码,用于请求标题并将它们与标题的内容进行比较。它完美的工作,但我不知道为什么。下面是代码:这个PHP代码究竟做了什么?

$headers = apache_request_headers(); 
    $customheader = "Header: 7ddb6ffab28bb675215a7d6e31cfc759"; 
    foreach ($headers as $header => $value) { // 1 
     $custom .= "$header: $value"; // 2 
    } 
    $mystring = $custom; // 3 
    $findme = $customheader; // 4 
    $pos = strpos($mystring, $findme); 
    if ($pos !== false) { 
// Do something 
} else{ exit(); } //If it doesn't match, exit. 

我评论与涉及以下问题的一些数字:

  1. 正是这里发生了什么?它是否将$ headers设置为$ header AND $ value?

  2. 再次,不知道这里发生了什么。

  3. 为什么设置变量为一个不同的变量?这是变量正在被使用的唯一领域,那么是否有理由将其设置为其他内容?

  4. 同样的问题3.

对不起,如果这是一个可怕的问题,但它一直困扰着我,我真的想知道为什么它的工作原理。那么,我明白它为什么会起作用,我想我只是想更具体地了解一下。感谢您提供的任何见解。

$headers = apache_request_headers(); 

获取标题数组。

$customheader = "Header: 7ddb6ffab28bb675215a7d6e31cfc759"; 

定义了它将搜索的“customheader”。

foreach ($headers as $header => $value) { // 1 
     $custom .= "$header: $value"; // 2 
    } 

遍历并创建一个$custom变量来保存膨胀$key=>$value报头。

$mystring = $custom; // 3 
    $findme = $customheader; // 4 
    $pos = strpos($mystring, $findme); 

查找扩展字符串中的$customheader

if ($pos !== false) { 
// Do something 
} else{ exit(); } //If it doesn't match, exit. 

确实不需要重新分配变量。本质上,它将头部数组变成一个大字符串,然后搜索文本以查看是否存在文本。

+0

谢谢,这一个解释它是最好的。现在我明白了 :) – Rob 2010-04-24 02:54:53

  1. 它遍历$ headers,将每个元素的关键字分配给$ header,并将值分配给$ value。因此,在块内部,我们在不同的变量中获取标题的名称和它的值。
  2. 在这一步中,我们使用点运算符将单个字符串中的所有标题连接起来。实质上,我们将数组中的标题转换为字符串。
  3. 除非在其他地方使用这些变量,否则没有重新分配的理由。

免责声明:我是一个红宝石的人,所以如果我错了,请纠正我。

apache_request_headers()返回当前请求中所有HTTP标题的关联数组,如果失败返回false。所以它很好地检查返回值为:

$headers = apache_request_headers(); 
if(! $headers) { 
die("Error fetching headers"); 
} 

1:您正在迭代您获得的关联数组。
2:在数组中形成粘贴键值对的字符串,键和值由冒号分隔。
3和4只是将一个变量分配给另一个变量。您可以直接使用:$pos = strpos($custom, $customheader);代替步骤3和4. strpos返回false如果找不到$customheader,则返回$custom否则返回找到的位置。

总的来说,这段代码会检查您的自定义标题是否存在于由apache_request_headers返回的标题中。