2011-07-27 45 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