2011-07-07 9 views
3

私はdoctrine 2とzend framework 1.11で作業しています。 Doctrine 2ではパブリックプロパティが推奨されないため、私は自分のエンティティプロパティを非公開にしました。しかし、Zend_Json :: encode()とjson_encode()はプライベート/保護されたプロパティを表示しないため、出力に追加しません。jsonはどのようにしてPHPのプライベートプロパティをエンコードしますか?

したがって、私はvar_dumpを使用すると空のセット、たとえばstring(4) "[{}]"を取得します。

私は自分の関数を記述してエンコーディングを行う必要があります。誰かが私が代わりに使うことができる解決策があることを望んでいました。

+0

私は同じことを読んで、これらのプライベートModelプロパティを回避しようとしましたが、最後にはあきらめました。私のアプリケーション内のDoctrine全体が、json_encodeを内部的に使用するExt.Direct APIによって公開されています。私の場合のモデルは自動生成されているので、シリアライザやパックメソッドで回避するのは多大な努力でした。私はそれが悪い習慣であることを知っているが、それでもそれはうまくいく。 –

答えて

6

民間が任意の外部コードに見えることからそれらを防ぐためであるとして、メンバ変数を持っていることの全体のポイント(シリアライズオブジェクト全体がするので例外ですセッション間で復元する必要があります)。

このオブジェクトをjson_encodingする代わりに、 "encode"というメソッドで "encodeable"というインターフェースを作成してください。これは、このオブジェクトで必要とされるメンバのjsonエンコードされた文字列を返します。これにより、すべてのメンバーをシリアライズする代わりに、シリアライズするメンバーを選択したり、シリアライズして他のデータをシリアライズすることもできます。

実際には、json_encodeで直接動作するJsonSerializableインターフェイスを実装することができます。

class MyClass implements \JsonSerializable 
{ 
    public function jsonSerialize() 
    { 
     return get_object_vars($this); 
    } 
} 

$myObject = new MyClass(); 
echo json_encode($myObject); 
+3

これを例に挙げてください。 – Nemus

0

あなたはjson_encodeにそれを渡す前に、あなたのオブジェクトをserialize()可能性()

+0

JavaScriptはどのようにそれをシリアル化しませんか? – webbiedave

+0

あなたはJavaScriptにもこの質問にもタグをつけませんでした:) – wonk0

+0

それは私の質問ではありません:)。 json_encodeは通常、JavaScriptで使用するためにデータをエンコードするために使用されるため、私はちょっと不思議でした。 – webbiedave

2

私はphp 5.4がJsonSerializableを持っていると信じていますが、これは簡単にするはずですが、私はPHP 5.3.8を使用しています。私は私が必要として、このように多くをテストし、私は私の性質は、公共持つために解決するつもりだと思いますが、これは自分のクラスのために働くように見えていませんでした:

class JSONEncoder{ 

public function json_encode($object){ 
    return json_encode($this->getFields($object)); 
} 

private function getFields($classObj){ 
    $fields = array(); 
    $reflect = new ReflectionClass($classObj); 
    $props = $reflect->getProperties(); 
    foreach($props as $property){ 
     $property->setAccessible(true); 
     $obj = $property->getValue($classObj); 
     $name = $property->getName(); 
     $this->doProperty($fields, $name, $obj); 
    } 

    return $fields; 

} 

private function doProperty(&$fields, $name, $obj){ 

    if (is_object($obj)){ 
     $fields[$name] = $this->getFields($obj); 
     return; 
    } 

    if (is_Array($obj)){ 
     $arrayFields = Array(); 
     foreach ($obj as $item){ 
      $key = key($obj); 
      $this->doProperty($arrayFields, $key, $item); 
      next($obj); 
     } 
     $fields[$name] = $arrayFields; 
    } 
    else 
     $fields[$name] = $obj; 
} 
} 
0

はどのようにこのクラスでメソッドを作成します。

function serialize(){ 
     return json_encode(get_object_vars ($this)); 
    } 
関連する問題