2012-02-09 13 views
0

私はPHPを学び始め、まともなJavaの背景を持っています。 PHPランゲージで次のようなコード化の問題が発生しました。PHPカスタムJsonを抽象クラスにエンコード/デコード

PHPクラスをJSON形式でエンコード/デコードできるようにします。プライベートプロパティのクラスに対してgetter/setterメソッドを利用するPHPクラスを作成しました。これにより、ネイティブのjson_encodeメソッドがエンコード中にこれらのプロパティをスキップするのをスキップしました。私はこのコード上に研究し、それが文字列やオブジェクトを生成してどのように実現

<?php 
public function encodeJSON() 
{ 
    foreach ($this as $key => $value) 
    { 
     $json->$key = $value; 
    } 
    return json_encode($json); 
} 
public function decodeJSON($json_str) 
{ 
    $json = json_decode($json_str, 1); 
    foreach ($json as $key => $value) 
    { 
     $this->$key = $value; 
    } 
} 
?> 

:私はプライベートプロパティをピックアップし、JSON文字列でそれらをフォーマット次のスクリプトを見つけました。今、このコードを抽象クラスにプッシュしたいので、そのクラスを拡張してこの機能を受け取ることができます。

具体的なクラスのプライベートプロパティを抽象クラスから参照できないという問題があります。私のJavaの知識では、抽象メソッドを指定せずに各具体クラスにそれを実装させることなく、これを行うことができないかもしれないことがわかります。私は、PHPでリフレクションを使用して、抽象クラスのコンストラクタに具体的なクラスを渡すいくつかの試みを試みました。誰かが正しい方向に私を指すことができますか、これが可能でないかどうか私に教えてください?

+1

'protected'では動作しますか? (私的な変数の概念は、納品されたクラスでそれらを見ることができないので、正しい動作です) – Vyktor

+0

@Vyktorはいそうです。私は新しいものを学ぶことに集中していたので、私は基本的なプログラミングの基礎を忘れて無視しました。それを選んでいただきありがとうございます。あなたが答えとしてそれを投稿するなら、私は受け入れます。 –

答えて

1

private variablesのコンセプトは、配信されたクラスでそれらを見ることができないため、正しい動作です。

代わりにprotectedを使用すると、コンセプトはうまくいくはずです。

+0

もう一度ありがとうございます。私は、Javaでジャクソンのシリアライズとデシリアライズに慣れているので、フィールドを非公開にしてスコープのアイデアを無視することができます –

+0

PHPは2つのシリアル化方法を提供しています。一つは '__sleep'と' __wakeup'(http: //sk.php.net/manual/en/language.oop5.magic.php#object.sleep)と 'Serializable interface'(http://sk.php.net/manual/en/class.serializable.php)私たちはここで素敵な議論をしました:http://stackoverflow.com/questions/9114368/transient-properties-in-a-php-class/9114433#9114433 – Vyktor