2013-03-18 12 views
5

-Code in Elternklasse:Sehen Sie, ob eine statische Eigenschaft in einer Kindklasse aus der Elternklasse existiert (späte statische Bindung)?

foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
    // Do something 
} 

Dies funktioniert, wenn $ _aReadOnlyDatabaseTables in der Kindklasse definiert ist, sondern wirft einen Fehler, wenn $ _aReadOnlyDatabaseTables fehlt. Ich muss prüfen, ob diese Eigenschaft zuerst existiert.

denke ich, es so etwas wie dies gehen sollte:

if(property_exists(static,$_aReadOnlyDatabaseTables)){ 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 

Aber das wirft einen Syntaxfehler, unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM. Mit $this anstelle von static funktioniert auch nicht, es wertet immer falsch.

Was ist die richtige Syntax für das?

Antwort

7

du versuchen sollte:

if(property_exists(get_called_class(), '_aReadOnlyDatabaseTables')) { 
    foreach(static::$_aReadOnlyDatabaseTables AS $TableName => $aColumns){ 
     // Do something 
    } 
} 
+0

So würde es mit späten statischen Bindungen gemacht werden. – nickb

+3

@ Nick Es wäre wahrscheinlich schneller und effizienter, nur die Array in Ihrem Elternklasse zu deklarieren und bei Kindern außer Kraft setzen. Dann können Sie die Immobilienprüfung überspringen. Die Außerkraftsetzung würde einmal zur Kompilierungszeit erfolgen und würde nicht jedes Mal zusätzlichen Aufwand verursachen, wenn die Methode aufgerufen wird. –

+0

@ColinMorelli, danke, ich werde das auch tun, aber mein Ziel war es vorerst, alle untergeordneten Klassen zu erkennen, in denen diese Eigenschaft noch nicht implementiert war. – Nick

3

Der richtige Weg würde den Wert mit einem vernünftigen Standardwert (leer-Array) in der übergeordneten Klasse wird initialisiert. Auf diese Weise können Sie sicher sein, dass die Eigenschaft existiert.

Alles, was man in einer Klasse zugreifen sollte richtig definieren es verfügbar sein, wenn Sie die Klasse für sich verwenden.

+0

Dies wird im Allgemeinen gut beraten, aber es doesn beantworte die gestellte Frage nicht. Es ist auch eine gute Übung, zu testen, dass ein Array vorhanden ist und dass es tatsächlich ein Array ist, bevor Sie versuchen, eine Schleife darüber zu führen. – Nick

0

sollten Sie in der Lage sein, diese schnell und schmutzig zu tun mit get_class() anstelle des static Stichwort:

if (property_exists(get_class($this), '_aReadOnlyDatabaseTables')) { ... } 
+0

'$ sollte this' nicht in statischen Methoden zur Verfügung stehen, wo ich denke, die OP den Code in seiner Frage –

+0

habe ich nicht in der OP nicht erwähnt, aber dies ist eine instanzierte Klasse und eine nicht-statische Methode in Frage, den Zugriff auf eine statische Eigenschaft. – Nick

+0

Nun, in diesem Fall ist '$ this' Referenz dann verfügbar. –

Verwandte Themen