簡體   English   中英

本身調用PHP函數

[英]Calling PHP function in itself

在下面的腳本函數中,clean($ data)在其中調用了該函數,據我所知,但是它如何清除語句$ data [clean($ key)] = clean($ value)中的數據。 ??? 感謝您提供任何幫助。.由於我是PHP的新手,所以我試圖找出原因。 問候。

if (ini_get('magic_quotes_gpc')) {
function clean($data) {
    if (is_array($data)) {
        foreach ($data as $key => $value) {
            $data[clean($key)] = clean($value);
        }
    } else {
        $data = stripslashes($data);
    }

    return $data;
}           

$_GET = clean($_GET);
$_POST = clean($_POST);
$_REQUEST = clean($_REQUEST);
$_COOKIE = clean($_COOKIE);

}

你的問題:

因此,如果我理解正確,您想知道該行中的功能是什么

 $data[clean($key)] = clean($value);

答案:

看到該函數的主要目的是使用php的stripslashes方法從字符串中刪除斜杠。

如果輸入項是數組,則它會通過在鍵和值上調用自身來嘗試清除數組的鍵以及數組的值。

在php中,數組就像hashmaps一樣,您可以使用foreach循環遍歷鍵和值,如下所示

 foreach ($data as $key => $value) {....}

因此,如果您想在代碼段中總結算法,則如下所示

  1. 檢查輸入是否為數組。 如果不是,請轉到步驟4
  2. 對於數組的每個項目,請通過對其調用clean方法來清除鍵和值(遞歸)
  3. 返回數組
  4. 使用stripslashes方法清理輸入字符串5返回清理后的輸入

據我了解,它不是在清理密鑰,而是使用清理密鑰創建一個新元素,而未清理的密鑰仍然保留。

變成

$ a ['foobar']:值

如果我錯了,有人糾正我。

如果這樣寫的話,也許您會更好地理解代碼:

foreach ($data as $key => $value) {
            $key = clean($key); // Clean the key, the
            $value = clean($value); // Clean the value
            $data[$key] = $value; // Put it in the array that will be returned
        }

假設您有一個這樣的數組:$ _POST = array(0 =>'foo',1 => array('bar'=>'baz')); 將會發生以下情況:

Call clean($_POST);
call clean 0
call clean 'foo'
$return[0] = 'foo'
call clean 1
call clean 'bar'
call clean 'baz'
$return[1] = array('bar' => 'baz');

您可能應該閱讀以下內容: http : //www.codewalkers.com/c/a/Miscellaneous/Recursion-in-PHP/

該函數的主要目的是清除關聯數組單個變量。 關聯數組是一個數組,您可以在其中定義鍵和該鍵的值。 因此在PHP中使用的特殊數組如$_GET $_POST等。

“清除”的含義是檢查魔術引號是否處於活動狀態-當您將動態數據發布到PHP頁面時,這會導致這些數組中的某些字符以反斜杠轉義。 $_GET["Scarlett"] = "O' Hara"帶有引號$_GET["Scarlett"] = "O\\' Hara"

因此,如果魔術引號處於活動狀態,則函數將處理此問題,並去除斜杠,以便字符串保留其正確的值,而不是轉義的值。

該算法檢查傳遞給該函數的數據是否為數組,否則將直接清除該值。

$string = "Escapes\'in\'a string";
clean($string);
  • 是數組嗎? 否。然后返回反斜杠(我的數據)

    $ array = array(“ key \\'with \\'escapes” =>“ value \\'with \\'escapes”,“ another \\'key” =>“ another value”); 干凈($ array)

  • 是數組嗎? 是。 因此,使用foreach每個鍵/值對,像第一個示例一樣獲取並清理鍵; 然后取值並執行相同操作,然后將清理后的版本放入數組中。

如您所見,該函數具有兩個不同的行為,這些行為通過該“ if”語句來區分。 如果傳遞數組,則會激活第二種行為,該行為依次傳遞成對的字符串而不是數組,從而觸發第一種行為。

我的想法是,此功能無法正常運行。 有人有同樣的感覺嗎? 我尚未對其進行測試,但似乎不是從替換鍵/值的意義上“清除”鍵/值,而是未清除的版本添加到已清除的版本中。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM