2015-12-29 23 views
14

sto ottenendo questo errore:PHP7 method_exists errore non rilevato: Nome della funzione deve essere una stringa

Fatal error: Uncaught Error: Function name must be a string in

Per questo codice:

if (function_exists($item['function'])) { 
    $item['function']($item, $default); 
} elseif (method_exists($this, $item['function'])) { 
    $this->$item['function']($item, $default); 
} 

So che cambiando il codice per

if (function_exists($item['function'])) { 
    $item['function']($item, $default); 
} elseif (method_exists($this,$item['function'])) { 
    $this->{$item['function']}($item, $default); 
} 

Risolto questo errore, ma la mia domanda è, dovrebbe questa linea

$item['function']($item, $default); 

anche essere convertiti in

{$item['function']}($item, $default); 

o può essere lasciata così com'è?

+0

Sei sicuro che questo tasto funzione è impostato e si tratta di una stringa? Aggiungi assegni prima di usarlo. – Svetoslav

risposta

-1

E utilizzare invece (senza) array.

@Svetlio, non per versioni precedenti, ma per compatibilità!

Perché le persone fraintendono questo? Siete tutti troppo pigri per scrivere un'altra riga per il compito?

+2

Nella vecchia versione di PHP sì, ma in 7 non è obbligatorio. – Svetoslav

21

Ciò è dovuto al incompatible changes nella valutazione ordine-di-per l'elaborazione di variabili e metodi indiretti:

Changes to the handling of indirect variables, properties, and methods

Indirect access to variables, properties, and methods will now be evaluated strictly in left-to-right order, as opposed to the previous mix of special cases. The table below shows how the order of evaluaiton has changed.

No, non c'è bisogno di cambiare questa linea:

$item['function']($item, $default); 

Perché non c'è una valutazione speciale in corso qui, verrà utilizzato semplicemente l'elemento array come nome funzione e richiamerà la funzione. Potresti cambiarlo e il codice funzionerà ancora correttamente, ma non è necessario.

Ma, come avete già fatto in modo corretto è necessario cambiare:

$this->$item['function']($item, $default); 

a:

$this->{$item['function']}($item, $default); 
     ↑     ↑ 

Poiché, come si può vedere in questo table:

     Old and new evaluation of indirect expressions 
     Expression   PHP 5 interpretation   PHP 7 interpretation 
------------------------------------------------------------------------------- 
    $$foo['bar']['baz'] |  ${$foo['bar']['baz']} | ($$foo)['bar']['baz'] 
    $foo->$bar['baz'] |  $foo->{$bar['baz']} | ($foo->$bar)['baz'] 
    $foo->$bar['baz']() |  $foo->{$bar['baz']}() | ($foo->$bar)['baz']() 
    Foo::$bar['baz']() |  Foo::{$bar['baz']}() | (Foo::$bar)['baz']() 

PHP 7 sarà supponiamo che tu prima voglia accedere ad una proprietà dell'oggetto, e poi vuoi accedere ad un indice da quello proprietà e utilizzare il suo valore come nome del metodo per chiamare un metodo (da sinistra a destra).

Per utilizzare la variabile e l'indice come nome della proprietà, è necessario utilizzare le parentesi graffe per indicare che.