2017-01-10 40 views
0

請爲我的英語感到抱歉。父類的靜態變量兒童類的不同值

我的問題:

abstract class Entity 
{ 
    protected static $fieldNames; 

    public static function getFieldsNames() 
    { 
     if (is_null(static::$fieldNames)) { 
      foreach (static::$fieldsMap as $name => $map) { 
       static::$fieldNames[] = $name; 
      } 
     } 

     return static::$fieldNames; 
    } 
} 

class User extends Entity 
{ 
    protected static $fieldsMap = [ 
     'id' => [ 
      // ... 
     ], 
     'name' => [ 
      // ... 
     ], 
     'phone' => [ 
      // ... 
     ] 
    ]; 
} 

class Car extends Entity 
{ 
    protected static $fieldsMap = [ 
     'id' => [ 
      // ... 
     ], 
     'brand' => [ 
      // ... 
     ], 
     'color' => [ 
      // ... 
     ] 
    ]; 
} 

print_r(User::getFieldsNames()); 
// ['id', 'name', 'phone'] - On first call it works as expected, but... 

print_r(Car::getFieldsNames()); 
// ['id', 'name', 'phone'] :(

如果我宣佈$用戶和汽車類的字段名工作得很好,但在實際項目中,我有幾十實體

它是靜態變量,例如$字段名和數百個可能的最佳解決方案?

也許創建一個小的存儲庫類,將保持這些靜態變量的實體的ID?或另一種優雅的方式?

感謝任何幫助!

+0

可能是因爲'$ fieldNames'是靜態的;並且你正在檢查它是否已經填充if(is_null(static :: $ fieldNames)){'所以它不會重新填充一個不同的子類......爲什麼不簡單地'返回static :: $ fieldsMap;'? –

+0

如果你想在繼承中使用靜態方法/變量,那麼確保你使用PHP7,因爲舊版本有很多限制。 –

+0

@Mark Ba​​ker 在實際的項目中會有數十個帶有計算/處理值的靜態變量,而且我希望爲每個實體設置一次這些值,同時在運行時腳本中獲得更好的性能,因此,我不能只使用'return static :: $ var' – Eonian

回答

0

$ fieldNames是靜態的,所以它與類本身相關聯,而不是與特定對象關聯。 本例中的類是「實體」。 一旦你設置它不再爲空。