2013-03-18 16 views
5

Codice in classe genitore:Verificare se esiste una proprietà statica in una classe figlia dalla classe genitore (associazione statica avanzata)?

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

Questo funziona quando $ _aReadOnlyDatabaseTables è definito nella classe figlia, ma genera un errore quando $ _aReadOnlyDatabaseTables è assente. Devo controllare se questa proprietà esiste prima.

penso che dovrebbe andare qualcosa come questo:

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

Ma questo getta un errore di sintassi, unexpected ',', expecting T_PAAMAYIM_NEKUDOTAYIM. L'utilizzo di $this invece di static non funziona, viene sempre valutato come falso.

Qual è la sintassi corretta per questo?

risposta

7

si dovrebbe provare questo:

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

Ecco come si farebbe con i collegamenti statici avanzati. – nickb

+3

@Nick Probabilmente sarebbe più veloce e più efficiente dichiarare semplicemente l'array nella classe genitore e sovrascriverlo nei bambini. Quindi puoi saltare il controllo della proprietà. L'override verrebbe eseguito una volta al momento della compilazione e non comporterebbe un sovraccarico aggiuntivo ogni volta che veniva chiamato il metodo. –

+0

@ColinMorelli, grazie, lo farò anche io, ma il mio obiettivo per il momento era quello di rilevare qualsiasi classe figlia in cui questa proprietà non fosse ancora implementata. – Nick

3

Il modo corretto sarebbe inizializzare il valore con un valore predefinito valido (array vuoto) nella classe padre. In questo modo puoi essere sicuro che la proprietà esisterà.

Tutto ciò che si accede a una classe dovrebbe essere disponibile definendolo correttamente quando si utilizza la classe da sola.

+0

Questo è buoni consigli in generale, ma esso doesn rispondere alla domanda che è stata posta. È anche buona norma verificare che una matrice esista e che sia in realtà una matrice prima di tentare di eseguire il loop su di essa. – Nick

0

Si dovrebbe essere in grado di fare questo rapido e sporco utilizzando get_class() anziché la parola chiave static:

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

'$ this' non dovrebbe essere disponibile in metodi statici, dove suppongo che l'OP abbia inserito il codice nella sua domanda –

+0

Non l'ho menzionato nell'OP, ma questa è una classe istanziata e un metodo non statico in questione, accedendo una proprietà statica. – Nick

+0

Bene, in questo caso il riferimento "$ this" è disponibile allora. –

Problemi correlati