2014-01-14 39 views
0

我有這個PHP代碼塊 - :訪問使用變量靜態變量 - PHP

$visible_to = 'private'; 
$icon = array('public' => 'ICON_GLOBE', 'private' => 'ICON_LOCK'); 
echo TbHtml::$icon[$visible_to]; 

但運行此版畫 - :Access to undeclared static property: TbHtml::$icon

我的代碼有什麼問題?謝謝:)

繼承人的TbHtml類 - :

class TbHtml 
{ 
    const ICON_GLOBE = 'Its a globe'; 
    const ICON_LOCK = 'Its a lock'; 
} 
+0

您需要向我們展示TbHtml類以便我們弄清楚。 –

+1

您的代碼存在的問題是您正嘗試訪問**未聲明的靜態屬性**。 – kero

+0

那麼我需要做什麼代碼更改? – sanchitkhanna26

回答

2

人們對Mubo的投票是低調的,但他的回答在我看來是最接近正確的。你不應該試圖用動態部分來調用類常量。爲什麼不這樣做:

$visible_to = 'private'; 
$icon = array('public' => TbHtml::ICON_GLOBE, 'private' => TbHtml::ICON_LOCK); 
echo $icon[$visible_to]; 
+0

一個非常簡單而有效的方法。這唯一的缺點可能是調用代碼與類緊密耦合,因爲它需要理解靜態常量名。如果你想解耦這個,你可以考慮公開一個接受「可見性」值的靜態方法,並返回適當的靜態屬性值。 –

+0

看起來不錯..... – sanchitkhanna26

0

你需要這樣做:

echo TbHtml::${$icon[$visible_to]}; 

兩個美元符號,讓你得到的$圖標[$ visible_to]與值使用它作爲變量名稱。

但是,這種詭計是錯誤的代碼。這將是更好的做法,如果你做了這樣的事情,在這裏存放圖標的數組,這樣你就不會保存$圖標數組中的變量名,而是他們的鑰匙:

class TbHtml 
{ 
    const ICONS = array('GLOBE'=>'Its a globe', 'LOCK'=>'Its a lock') 
} 

$visible_to = 'private'; 
$icon = array('public' => 'GLOBE', 'private' => 'LOCK'); 
$visible_to_icon = $icon[$visible_to]; 
echo TbHtml::$globe[$visible_to_icon]; 
+0

這個答案在技術上可能是正確的,但變量變量($$)是非常差的練習,應該被勸阻 –

+0

這是真的,我會更新。 –

+0

所以只需做'$ {$ icon [$ visible_to]}'? @JasonFingar – qwertynl

0

您可以利用get_class_vars()得到這個信息:

$class_vars = get_class_vars('TbHtml'); 
$desired_value = $class_vars[$icon[$visible_to]]; 

不過我建議你們班露出一個靜態方法,如果你的類需要理解公開與私人:

public static function get_icon_by_visibility($visibility = 'public') { 
    if ($visibility === 'public') { 
     return self::ICON_GLOBE; 
    } else if ($visibility === 'private') { 
     return self::ICON_LOCK; 
    } else { 
     throw new Exception('Invalid paramater passed.'); 
    } 
} 

// usage 
echo TbHtml::get_icon_by_visibility($visible_to);