2017-01-10 4 views
0

Entschuldigung für mein Englisch.Klassenvariable der Elternklasse für Kinderklassen anderer Wert

Mein Problem:

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'] :(

Wenn ich $ Feldnamen in User und Auto-Klassen funktionieren, aber in realen Projekt erkläre ich zig statischen Variablen wie $ Feldnamen und Hunderte von Entität

Ist es hat möglich zur besten Lösung?

Vielleicht kleine Repository-Klasse erstellen, die diese statischen Variablen nach Entity-ID behalten? oder ein anderer eleganter Weg?

Danke jede Hilfe!

+0

Wahrscheinlich, weil '$ fieldNames' statisch ist; und du überprüfst, ob es bereits befüllt ist 'if (is_null (static :: $ fieldNames)) {' so wird es nicht für eine andere Kindklasse neu gefüllt ... warum nicht einfach 'static :: $ fieldsMap;'? –

+0

Wenn Sie statische Methoden/Variablen in der Vererbung verwenden möchten, stellen Sie sicher, dass Sie PHP7 verwenden, da ältere Versionen viele Einschränkungen aufwiesen. –

+0

@Mark Baker In realen Projekt wird Zehnen statische Variablen mit berechneten/behandelten Werte, und ich möchte nur einmal diese Werte für jede Entität während Laufzeit Skript für eine bessere Leistung, aus diesem Grund kann ich nicht nur 'statische Rückkehr zurückgeben :: $ var ' – Eonian

Antwort

0

$ fieldNames ist statisch, daher ist es mit der Klasse selbst und nicht mit einem bestimmten Objekt verknüpft. Die Klasse in diesem Fall ist "Entity". Sobald Sie es festgelegt haben, ist es nicht mehr null.

Verwandte Themen