web-dev-qa-db-ja.com

PHP7 method_exists Uncaught Error:関数名は文字列でなければなりません

このエラーが発生しています:

致命的なエラー:キャッチされないエラー:関数名は文字列でなければなりません

このコードの場合:

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);

それともそのままにできますか?

16
backups

これは、間接変数とメソッドを処理するための評価順序の 非互換の変更 が原因です。

間接変数、プロパティ、メソッドの処理の変更

変数、プロパティ、およびメソッドへの間接アクセスは、以前の特殊なケースの組み合わせとは対照的に、厳密に左から右の順序で評価されます。以下の表は、評価の順序がどのように変わったかを示しています。

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

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

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

しかし、すでに正しく行ったように、変更する必要があります。

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

に:

$ this->{$ item ['関数']}($ item、$ default); 
↑↑

あなたがこれで見ることができるので table

                    間接式の新旧の評価
式PHP 5解釈PHP 7解釈
 -------- -------------------------------------------------- --------------------- 
 $$ 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では、最初にオブジェクトプロパティにアクセスし、次にそのプロパティからインデックスにアクセスし、その値をメソッド名として使用してメソッドを呼び出すことを想定しています(左から右の順序)。

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

26
Rizier123