2015-12-29 16 views
14

私はこのエラーを取得していなければなりませんPHP7は不明なエラーをmethod_exists:このコードでは</p> <blockquote> <p>Fatal error: Uncaught Error: Function name must be a string in</p> </blockquote> <p>:関数名が文字列

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

私が知っている

if (function_exists($item['function'])) { 
    $item['function']($item, $default); 
} elseif (method_exists($this,$item['function'])) { 
    $this->{$item['function']}($item, $default); 
} 
にコードを変更します

このエラーは解決しましたが、私の質問は、この行でなければなりません

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

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

に変換するか、であるとして、それを残すことができ?

+0

このアイテムのファンクションキーが設定されていて、それは文字列ですか。それを使用する前にチェックを追加してください。 – Svetoslav

答えて

-1

(代わりに)配列を使用してください。

@Svetlio、古いバージョンではなく、互換性があります!

なぜ人々はこれを誤解していますか?あなたはすべて、割り当てのためにもう1行を書くのが面倒ですか?

+2

古いバージョンのPHPではyesですが、7ではその必要はありません。 – Svetoslav

21

これは、オーダー・オブ・評価間接的な変数やメソッドを処理するためにincompatible changesによるものです:

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.

いいえ、あなたはこの行を変更する必要はありません。

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

のでここで特別な評価は行われません。配列の要素を関数名として使用し、関数を呼び出すだけです。あなたはそれを変更することができ、コードは引き続き正しく動作しますが、必ずしも必要ではありません。

しかし、あなたはすでに正しくあなたは変更する必要がなかったとして:

     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意志:あなたはこのtableで見ることができるようにするので

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

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

をします最初にオブジェクトプロパティにアクセスし、そのオブジェクトのインデックスにアクセスする場合メソッドを呼び出すメソッド名として値を使用します(左から右の順序)。

変数とインデックスをプロパティ名として使用するには、その中かっこを使用する必要があります。

関連する問題