10

ご存知の方も多いと思いますが、PHP 5.4 alpha がリリースされました。下記について質問があります。

簡素化された文字列オフセットの読み取り。 $str[1][0]は現在、法的な構造になっています。

正確にはどのように機能し$str[1][0]ますか?

編集: http://php.net/releases/NEWS_5_4_0_alpha1.txt

4

3 に答える 3

11

これは、文字列オフセットを読み取ると、PHP が再び文字列を返し、その文字列で再びオフセットにアクセスできることを意味します。(そして、そのアクセスでさらに別のオフセット。それはおかしくなります$str[0][0][0][0][0][0]

PHP 5.4 より前では、「文字列オフセットを配列として使用できません」というエラーが発生していました。

于 2011-07-05T19:58:54.523 に答える
7

これは副作用であり、ここの提案で言及されました: http://php.markmail.org/thread/yiujwve6zdw37tpv

機能は、文字列オフセットの速度/最適化です。

やあ、

最近、文字列オフセットの読み取りが 2 段階で行われることに気付きました。まず、temporary_variable の特別な string_offset バリアントが zend_fetch_dimension_address_read() で作成され、次に実際の文字列値が _get_zval_ptr_var_string_offset() で作成されます。

そもそも本当の文字列を作成できると思います。これにより、文字列オフセットの読み取り操作が 50% 高速化され、VM でのいくつかのチェックと条件付き分岐を排除できます。

パッチが添付されています (テストのために zend_vm_execute.h を再生成することを忘れないでください)。ただし、1 つの偽のケースで動作が変わります。次のコードは "b" を発行するようになりました (現在、致命的なエラーが発生します - 文字列オフセットを配列として使用できません)。

$str = "abs";
var_dump($str[1][0]);

全然問題ないと思います。"abs"[1] -> "b" および "b"[0] -> "b" であるため、"b" は意味があります。

異議がなければ、パッチをコミットします。

ありがとう。ドミトリー。

于 2011-07-05T21:00:37.057 に答える
1

これにより、コードを php 5.3 から 5.4 にアップグレードすると、興味深いバグが実際に発生する可能性があります。

5.3 では、この構文は false を返します。

$array = array("This is a string");

echo isset($array[0][0][0]);

5.4 では、これは true を返します。

于 2013-02-12T10:07:32.280 に答える