4

このストリップダウンクラスを検討してください。

class foo {

    private $fooVar;


    public getFooVar(){

    }

}


$fooObj = new foo();

やりたい/やりたいのはこれをJSON形式に変換することなので

echo json_encode($fooObj);

ただし、それは機能しません。$ fooVarはプライベートであるため、fooVarとimの推測はありません。

妥協して$fooVarを公開せずにこれを行うことができる他の方法はありますか?

本当にありがとう!

4

3 に答える 3

4

PHP 5.3 (またはそれ以前) を使用している場合、求めていることを簡単に実行することはできません。JSON はデータ形式で関数を含まないため、JSON でエンコードされたメソッドを取得することはできません。また、プライベート プロパティであるため、プロパティを取得することもできません。あなたはすでにこれをよく知っていますが、あなたが正しいことを指摘するのは簡単ではありません。この場合、ゲッターを__get()読み取り専用のパブリック プロパティに変換するマジック メソッドとして記述しても機能しません。

PHP 5.3 では、使用できる回避策がいくつかあります。

  • Reflection. PHP には Reflection API が含まれており、プライベート メンバーからの値の読み取りなど、オブジェクトやクラスに関する詳細にアクセスできます。ただし、明らかに、これは値を取得するためにかなりの量のコードを作成することを意味し、高速でもありません。

  • json_encodeクラス内に呼び出しを記述します。そうすれば、プライベート プロパティを含めることができます。get_object_vars($this)オブジェクト内で使用して、JSON に適した方法でプライベート プロパティを取得することをお勧めします。

PHP 5.4 を使用している場合は、追加のオプションがあります。

  • PHP 5.4 ではJsonSerializableインターフェースが導入されました。クラスにを追加implements JsonSerializableし、 というメソッドを記述しますjsonSerialize()。このメソッドは、JSON 文字列にしたいデータを返す必要があります。必要なパブリック プロパティまたはプライベート プロパティを含めたり除外したりできます。

PHP 5.5 はまだリリースされていませんが、別のオプションが追加されます。

  • PHP 5.5 では、プロパティを定義するためのより複雑な構文が導入されます。これにより、プロパティを public で読み取り専用として定義したり、より複雑なロジックを getter および setter に含めたり、プロパティとして保持したりできます。__get()メソッドとメソッドが現在行っているのと同じように機能__set()しますが、変数がプロパティとして明示的に定義されているため、JSON シリアライザーからアクセスできる必要がありますが、現在は__get()そうではありません。
    [編集] - 上記の段落は正しくないことに注意してください。説明されている機能は、PHP 5.5 リリースには含まれていません。5.6 に移行するかどうかは、まだ言えません。

それが役立つことを願っています。

于 2013-02-10T10:34:48.277 に答える
1

JSON には型に関する情報がないため、JSON のデコードはカスタム型では少し注意が必要です。あなたが持っているのは、汎用オブジェクト (ハッシュ テーブル) と配列だけです。

ただし、オブジェクトを JSON にシリアル化するには、JsonSerializableインターフェイスを実装できます。次に、json_encode関数はあなたが望むことを行います。

于 2013-02-10T10:36:56.153 に答える
0

これにより、 class のすべてのプロパティ (public、private、および protected) を含む JSON が出力されますfoo

$reflection = new ReflectionClass('foo');
$properties = $reflection->getdefaultProperties();

echo json_encode($properties);
于 2013-02-10T10:23:36.607 に答える