2015-12-29 15 views
14

sein muss ich diese Störung erhalte:PHP7 method_exists nicht erfasste Fehler: Funktionsname ein String

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

Für diesen Code:

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

Ich weiß, geändert wird, um den Code zu

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

Dieser Fehler behoben, aber meine Frage ist, sollte diese Zeile

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

auch

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

umgewandelt werden oder kann es gelassen werden wie?

+0

Sind Sie sicher, dass diese Elementfunktions-Taste gesetzt ist und die Zeichenfolge? Fügen Sie Prüfungen hinzu, bevor Sie sie verwenden. – Svetoslav

Antwort

-1

Und stattdessen (ohne) Array verwenden.

@Svetlio, nicht für ältere Versionen, aber für kompatibel!

Warum Menschen dies missverstanden? Sie sind alle zu faul, um eine weitere Zeile für die Aufgabe zu schreiben?

+2

In älteren PHP-Version ja, aber in 7 ist es nicht sicher erforderlich. – Svetoslav

21

Dies ist auf incompatible changes in der Reihenfolge-of-Auswertung für die Verarbeitung von indirekten Variablen und Methoden:

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.

Nein, Sie müssen diese Zeilen nicht ändern:

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

Weil Es gibt hier keine spezielle Auswertung, es wird nur das Array-Element als Funktionsname verwendet und die Funktion aufgerufen. Sie können es ändern, und der Code wird weiterhin ordnungsgemäß funktionieren, aber es ist nicht erforderlich.

Aber wie du schon richtig gemacht müssen Sie ändern:

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

zu:

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

Da, wie Sie in diesem table sehen:

     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 wird Angenommen, Sie möchten zuerst auf eine Objekteigenschaft zugreifen und dann von dort auf einen Index zugreifen Eigenschaft, und verwenden Sie ihren Wert als Methodenname, um eine Methode aufzurufen (Reihenfolge von links nach rechts).

Um die Variable und den Index als Eigenschaftsnamen zu verwenden, müssen Sie geschweifte Klammern verwenden, um dies anzuzeigen.