2011-06-29 70 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

相关问题