binaryへのキャストって……?

昨日の「NULLへのキャストって……?」ではスルーしたけど、マニュアルの引用部分にあった(binary)も気になった人がいるはず。


使用可能なキャストを以下に示します。

  • (int), (integer) - 整数へのキャスト
  • (bool), (boolean) - 論理値へのキャスト
  • (float), (double), (real) - float へのキャスト
  • (string) - 文字列へのキャスト
  • (array) - 配列へのキャスト
  • (object) - オブジェクトへのキャスト
  • (unset) - NULL へのキャスト (PHP 5)

(binary) によるキャストや b プレフィックスのサポートは、PHP 5.2.1 で追加されました。

リストには入ってないけど、最後にしれっと一文追加されてるやつ。具体的な説明がなにも書かれていないのでどう使うものなのかさっぱりわからない。


先のマニュアルにはこのような例が載っている。


リテラル文字列や変数を、バイナリ文字列にキャストします。

<?php
$binary = (binary) $string;
$binary = b"binary string";
?>

しかし、PHPの文字列は元から(内部エンコーディングなどを持たない)ただのバイト列*1なので、わざわざキャストする意味がわからない。
試しにこんなことをしてみるが、なにか変わったようには見えない。

<?php
var_dump('こんにちは');                           // string(15) "こんにちは"
var_dump(b'こんにちは');                          // string(15) "こんにちは"
var_dump((binary)'こんにちは');                   // string(15) "こんにちは"
var_dump('こんにちは' === (binary)'こんにちは');  // bool(true)
var_dump('こんにちは' === b'こんにちは');         // bool(true)
?>

実際、ちょうど手元にあったPHP 5.4.13のzend_language_scanner.lではこのように定義されていた。

<ST_IN_SCRIPTING>"("{TABS_AND_SPACES}("string"|"binary"){TABS_AND_SPACES}")" {
    return T_STRING_CAST;
}

実はPHP6への布石だった?

どうもこれ、(かつての構想の)PHP6で内部実装がUnicodeになることへの布石だったようで、現在では特に意味が無いっぽい。
Unicode文字列がデフォルトになった時にバイト列を表現するために用意されているものらしい。
しかしPHP6でのUnicode化は断念して現在の5.3〜の道を歩んでるので……いらない子