2011-07-27 44 views
0

我试图用一类成员的内容访问的方法的变量:使用内容作为变量名

protected function method() { 
    $var1 = 'no'; 
    $var2 = 'no'; 

    if ($this->data['x']['y'] != 'bums') { 
     $$this->data['x']['y'] = 'yes'; 

     ${$this->data['x']['y']} = 'yes'; 
    } 
} 

$this->data['x']['y']可以具有内容VAR1或在这种情况下VAR2
但为什么我不能用这种方式访问​​方法变量?

+2

无法重现:http://ideone.com/Ccstl或http://ideone.com/THz2H我_can_访问变量这种方式(即使我认为,可变的变量是丑陋的) – KingCrunch

+0

请您尝试一下用/内部类方法。在我的例子中没有安全检查,但我有所有必要的检查。 – CSchulz

+1

有很多事情你可以做,你不应该这样做。我会建议找到另一种方法来满足您的要求。 –

回答

1

可变变量成为安全风险。即使你检查了它们,打开另一个向量也是没有意义的,你可以犯一个错误。反之,使用数组,他们更容易理解和清洁。

protected function method() { 
    $var = array(
     1 => 'no', 
     2 => 'no', 
    ); 

    if ($this->data['x']['y'] != 'bums') { 
     $var[$this->data['x']['y']] = 'yes'; 
    } 
} 
2

它始终是一个糟糕和不安全的做法是使用$$什么:

它会好得多更改为代码:

protected function method() { 
    $var1 = 'no'; 
    $var2 = 'no'; 

    switch ($this->data['x']['y']) { 
     case 'var1': 
      $var1 = 'yes'; 
      break; 
     case 'var2': 
      $var2 = 'yes'; 
      break; 
    } 
} 

HTH,安德烈

+0

当有必要的支票时,为什么它不安全?因为这是一个例子,我没有公布检查。 – CSchulz

+0

您没有提及支票,我在您的代码中看到过。我的版本已包含支票。如果你想这样做绝对动态为什么你这样试试: $ value = $ this-> data ['x'] ['y']; $$ value ='yes'; 这应该工作。 – Andreas

+0

@Andreas:与问题中的示例相同,可行(请参阅评论中的链接)。 – KingCrunch