2012-02-17 9 views
7

Quando codice "a prova di futuro" testandolo su PHP 5.4, ricevo un avviso che non capisco.In che modo il mio array indice un 'offset stringa illegale'?

function __clone() { 
    $this->changed = TRUE; 
    foreach ($this->conditions as $key => $condition) { 
    if (
    $condition['field'] 
    instanceOf QueryConditionInterface) { 
     $this->conditions[$key]['field'] = clone($condition['field']); 
    } 
    } 
} 

scoppio della $condition['field'] in una riga di ridurre la quantità di codice a concentrarsi. A proposito di quella linea specifica, PHP ha questo da dire

Attenzione: compensato stringa illegale 'field' in DatabaseCondition->__clone()

E non riesco proprio a vedere come 'campo', è un offset stringa di illegale. Immagino che mi manchi qualcosa di ovvio, ma se la community non riesce a trovare un problema, presenterò una segnalazione di errore.

Interpreto l'avviso come "In nessun caso 'campo' è una chiave valida". Questo errore avrebbe avuto senso se avessi provato per esempio un array come chiave.

+0

La revisione del codice serve a migliorare il codice di lavoro. Domande specifiche sul significato degli avvertimenti sono fuori tema lì. –

+1

Puoi 'var_dump ('$ this-> condizioni');'? –

+0

Questo errore si verifica anche durante l'installazione di Drupal in PHP 5.4 http://drupal.org/node/1483986 Credo che qualcosa in PHP 5.4 sia rotto, o forse "campo" è ora una parola chiave PHP riservata che non può essere utilizzata per gli array, ma Mi sto appoggiando a un bug PHP. È stato riferito che questo errore non si verifica nelle versioni precedenti su PHP. – Brain2000

risposta

2

L'avviso sembra come se dicesse che $condition è una stringa. Senza alcuna conoscenza del codice, non so se abbia senso.

+0

Bah, hai ragione. Come suggerito da "Mike Purcell" sopra, ho var_dump $ condizioni quando si verifica l'errore, e sembra che a volte diventi una stringa. – Letharion

3

Senza ulteriori informazioni sulla creazione dell'array/iteratore delle condizioni, posso solo supporre che si debba prima controllare se esiste l'offset.

if(isset($condition['field']) && $condition['field'] instanceOf QueryConditionInterface) 

Utilizzando isset in questa situazione è abbastanza e più veloce di array_key_exists, l'unica differenza è che, se $ condizione [ 'campo'] è isset NULL tornerà cadute, array_key_exists torneranno vero, causano esiste la chiave. Ma poiché si desidera lavorare solo su campi che sono un'istanza di QueryConditionInterface, si eseguirà correttamente con isset.

+0

Questo probabilmente mi sta rallentando, ma non vedo come si applica? Se questo fosse stato un avviso sul "campo" non esistente, non avrei avuto problemi a ricalcolare il problema e trovare la fonte del problema. Ma ora, il modo in cui leggo l'errore, in nessuna circostanza è "campo" una chiave valida; non ha senso per me. Aggiunto questo alla domanda pure. – Letharion

+0

se $ condizione non è implementazione di array o array, allora stai cercando di accedere alla stringa e non puoi accedere alla stringa char array con una stringa come chiave e ottenere l'errore di offset di stringa illegale, è nuovo per me vedere questo errore su 5.4 per lo più lo vedo sul ramo 6.0 ... –

+0

Il valore di $ condizione può essere 'AND' ad esempio. – olleolleolle

Problemi correlati