AMFPHP1.9b2でByteArrayをもらう、返す


AMFPHPでByteArrayをもらったり、返したりするにはちょっとだけコツがあります。

<?php

class ByteArrayTest{
    function putByte($image){
        
        // 引数で受け取るときはbinaryデータはdataプロパティに入る
        // のでこう書く。
        $binary = $image->data;
        
        // 返すときはByteArrayクラスとして返す。
        // コンストラクタにバイナリを入れる。
        return new ByteArray($binary);
    }
}
?>

ここでいうByteArrayクラスというのは、AMFPHPのWrapperClasses.phpのByteArrayクラスのことです。

PHPの引数に渡ってくるときは、このクラスのオブジェクトとして渡ってきます。
同様に、
戻り値として返す場合は、このByteArrayクラスのオブジェクトにすることで
ASのByteArrayとしてシリアライズしてくれます。

DtoなどのオブジェクトのプロパティがByteArrayでもちゃんとマッピングしてくれます。


最近公開されたAMF3 Specificationによると256MBまでいけるそうで。。



これはこれで問題ないのですが、


PHPのほうで問題がありまして、


MySQLのBLOB型のカラムにバイナリデータを格納するのはうまくいくのに、

DBから取り出す際の、
PDOやmysql_fetch_array()関数などでおかしくなってるか、
または
Dtoの配列にして、その配列を入れ替えたりすると、

オブジェクトが壊れるというか、


変数のサイズを超えて値が入ってるような、C++の構造体でcharの長さを超えて値を入れて次の変数の値を壊してしまうような感じになってしまう。。



もちろんふつうにnew ByteArray($binary)して、そのままASに返したりすれば問題ないのですが、


Dtoに入れて、配列にいれて、配列の順番を入れ替えて、、とかやってるとおかしくなるんですよね。とほほです。



PHPってバイナリデータを扱うときはなんかコツがあるんでしょうかね

僕はこれで3日くらい費やしてしまいました。
納期のこともあったので、ここから先は調べられていません。


なんか知ってる方いたら教えてください。