2012-04-18 39 views
1

我知道,在PHP中,當您想要函數參數引用目標變量時,我們使用符號&符號。但我無法弄清楚在以下情況下它是否仍然有效且可靠(從請求中收集變量)。PHP:請求數據的函數參數引用

​​

,甚至在這種情況下:

$v1 = $_POST['v1']; 
$v2 = $_POST['v2']; 

function filled() { 
    $args = &func_get_args(); // does this even take the references and not the values? 
    foreach ($args as &$arg) { 
     if (empty($arg) || !isset($arg)) return false; 
    } 
    return true; 
} 

if (!filled($v1, $v2)) // etc. 

預先感謝澄清。

+2

對不起,我不明白,爲什麼你需要參考你的例子? – g13n 2012-04-18 23:56:21

+0

節省內存? – Jack 2012-04-18 23:59:40

+0

實際上你是對的。無論如何,你認爲第二功能的第一行工作,至少呢? – inhan 2012-04-19 00:01:31

回答

2

它仍然有效,因爲引用並不關心變量是用戶定義的還是來自PHP超全局變量,但第一個示例中存在一些問題。

首先,當你做$v1 = $_POST['v1'];$v1現在獨立於$_POST['v1']變量。因爲您做了副本,因此對$v1的任何更改都不會反映在$_POST['v1']中。

你可以這樣做:$v1 = &$_POST['v1'];創建一個對它的引用。

其次,在函數中調用isset將始終返回true。 isset是一種特殊的語言結構,不是函數。如果$_POST['v1']未設置,$v1仍將在分配$_POST['v1']$v1後設置(但將爲空)。

此外,據我所知,func_get_args()不支持引用,它返回的所有值都是原始副本。

這是否解決了一些問題?如果沒有,請隨時詢問你想澄清的任何事情。

+0

這是一個很好的說明,謝謝。那麼對於第二個例子,將使用數組作爲唯一參數解決參考問題? – inhan 2012-04-19 00:09:06

+0

是的,對於第二個例子,我認爲你需要傳遞數組並直接接收它,因爲func_get_args不允許你引用實際的參數。 mitab at edabg dot com有一個關於php.net/func_get_args的評論,它顯示了你如何獲得引用,但是它有點駭人聽聞,我不會在任何發佈的代碼中使用它。 – drew010 2012-04-19 00:13:36

1

場景1:它不會做你想做的,因爲$var將始終設置爲一個函數參數。但是,如果您想檢查此參數是否不包含空值(空,假等),則可以執行empty($var)。那裏不需要使用&。 您可以按照!empty($_POST['v1')來完成。如果你將某些東西傳遞給函數,它必須具有價值,所以在函數中使用isset()將不會執行任何操作。外部使用array_key_existsisset()empty()

情景2:func_get_args()不需要&,放下它。 $arg也不需要它,並將始終設置,所以isset()檢查是沒用的,雖然只有empty()是有用的。如上所述,如果您想查看數組密鑰是否存在,請使用isset($_POST['v1'])!empty($_POST['v1'])

+0

非常感謝。那是一些有價值的信息。 – inhan 2012-04-19 00:10:50