2017-01-10 43 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是静态的,所以它与类本身相关联,而不是与特定对象关联。 本例中的类是“实体”。 一旦你设置它不再为空。