ご存知の方も多いと思いますが、PHP 5.4 alpha がリリースされました。下記について質問があります。
簡素化された文字列オフセットの読み取り。
$str[1][0]
は現在、法的な構造になっています。
正確にはどのように機能し$str[1][0]
ますか?
ご存知の方も多いと思いますが、PHP 5.4 alpha がリリースされました。下記について質問があります。
簡素化された文字列オフセットの読み取り。
$str[1][0]
は現在、法的な構造になっています。
正確にはどのように機能し$str[1][0]
ますか?
これは、文字列オフセットを読み取ると、PHP が再び文字列を返し、その文字列で再びオフセットにアクセスできることを意味します。(そして、そのアクセスでさらに別のオフセット。それはおかしくなります$str[0][0][0][0][0][0]
)
PHP 5.4 より前では、「文字列オフセットを配列として使用できません」というエラーが発生していました。
これは副作用であり、ここの提案で言及されました: 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" は意味があります。
異議がなければ、パッチをコミットします。
ありがとう。ドミトリー。
これにより、コードを php 5.3 から 5.4 にアップグレードすると、興味深いバグが実際に発生する可能性があります。
5.3 では、この構文は false を返します。
$array = array("This is a string");
echo isset($array[0][0][0]);
5.4 では、これは true を返します。