2011-06-29 112 views
1

我的表單中的一個字段是 你有工作嗎?

我已經編輯後的數據到一個數組$ form_data使用此代碼

if (get_magic_quotes_gpc()) { 
    $unescaped_post_data = stripslashes_deep($_POST); 
} else { 
    $unescaped_post_data = $_POST; 
} 
$form_data = json_decode($unescaped_post_data['data_json']); 

但是,如果我嘗試設置一個變量

$job_offer = $form_data->do_you_have_a_job_offer?[0]; 

使用問號打破了腳本。什麼是正確的語法?

+8

*爲什麼*你可以使用一個問號,或者甚至是完全句子,在控制名稱? –

+4

給表單字段一個沒有問號的名字? – GWW

+1

問號不能成爲PHP中標識符名稱的一部分。 – mauris

回答

2

只需使用護腕:

$form_data->{'do_you_have_a_job_offer?'} 

manual page

包含下PHP的命名約定不允許(例如連字符)字符的對象內訪問元件可以通過封裝元件來實現大括號內的名字和撇號。

該解決方案有效。但是您應該考慮重構代碼以使用標準名稱約定來重命名該變量(請參閱this answer)。這不會立即給出結果,但會減少您(或您的後繼者)花費在調試此代碼上的時間。

+1

儘管這可能會使其起作用,但它不是正確的修復方法。 –

+0

謝謝伊萬,這個作品! – Planetburgess

+0

@Ignacio你會發現,在這個特殊情況下,使用「不正確」(我仍然不確定爲什麼會這樣)變量名會容易得多。這看起來不像某種「家庭作業」應用程序。在現實世界中,有時你只需要解決問題。在這種情況下重命名變量會很痛苦,因爲您需要更改html,javascript和php代碼。我已將您的擔憂添加到答案中。 –

4

@Ivan demonstrated一樣,您可以在不放棄問號的情況下訪問該值。這就是說,只因爲你可以做點事不代表你應該

爲了您長遠的理智,解決方案是堅持有效的命名約定。根據文檔:

變量名稱遵循與PHP中其他標籤相同的規則。有效的變量名稱以字母或下劃線開頭,後跟任意數量的字母,數字或下劃線。

在標籤中使用問號可能會使您自己或其他人在以後的道路上感到困惑。畢竟,問號被保留在PHP操作如下面的三元看出:

$foo = $bar? 0 : 1 ; 

在標籤中避免它肯定會增加很多年你的生活,特別是如果一個精神病斧頭謀殺被聘爲稍後保持你的代碼;)

+0

我不知道,是一個數組鍵被認爲是一個變量? –

+1

@Jared數組鍵似乎具有很大的靈活性,但是如果我的一位開發人員正在寫這樣的密鑰,我會非常緊張。在我真誠的*意見*中,鑰匙應該享受與變數相同的限制。 – Sampson

+0

@Jonathan Sampson - 對於審慎的,有組織的程序員內部秩序感(因爲如果我們已經做了足夠長的時間,我們都已經在那裏了),我並不認爲這是不可信的。根據文檔,我只是不一定同意這是一個無效的命名約定。 –

0

雖然我不認爲這是一個好主意,但Ivan Nevostruev是正確的。由於他回答,同時我把測試用例在一起,下面將工作:

<?php 

class test { 
    function set($key, $val) { 
     $this->$key = $val; 
    } 
} 

$form_data = new test; 
$form_data->set('do_you_have_a_job_offer?',array('test')); 

print_r($form_data->{"do_you_have_a_job_offer?"}); 

?> 

輸出:

Array 
(
    [0] => test 
) 

http://codepad.org/l62mGQ8Q

相關問題