0

私は奇妙なことに出くわしました。私はこれに似たクラスを持っています:

class Test {
    public $id;
    public $name;
    public $details;

    private $hidden;
    private $otherhidden;

    public function __construct() {
         $this->id = 1;
         $this->name = 'test';
         $this->details = 'test';
         $this->hidden = 1;
         $this->otherhidden = 1;
    }

    public function toArray() {
        $array = (array) $this;
        print_r($array);
        $array['Testhidden'] = 2;
        $array['Testotherhidden'] = 2;
        unset($array['details']);
        unset($array['Testhidden']);
        unset($array['Testotherhidden']);
        print_r($array);
        return $array;
    }
}

Test のインスタンスを作成して$test = new Test;実行すると$array = $test->toArray();、2 つの配列が出力されます。

Array
(
    [id] => 1
    [name] => test
    [details] => test
    [Testhidden] => 1
    [Testotherhidden] => 1
)
Array
(
    [id] => 1
    [name] => test
    [Testhidden] => 1
    [Testotherhidden] => 1
)

したがってdetails、配列内のキー付きアイテムの設定を解除できますが、値を変更したり、オブジェクトでプライベートだった要素の値を設定解除したりすることはできません。配列の値を変更できない理由についてのアイデアはありますか? 明らかに、オブジェクトから配列に渡されるある種の継承があります。

編集

get_object_vars()代わりに使用(array)すると、プライベート要素を変更できます。だから私は回避策を持っていますが、なぜこれが起こるのかを知ることはまだいいでしょう.

4

3 に答える 3

2

表示される動作は、オブジェクトを配列にキャストするときに、非公開プロパティに対応する配列のキーに印刷できない「魔法の」文字列がプレフィックスとして付けられるためです。

内部の実際のキーはandで$arrayありません 。あなたはそれを簡単に見ることができますTesthiddenTestotherhidden

print_r(array_map('urlencode', array_keys($array)));

urlencode印刷できない文字を印刷可能な表現に変換する非常に便利な方法としてランダムに選択しましたが、もちろん、そのプロパティを持つ他の関数も同様に機能します。

于 2013-08-09T15:36:12.120 に答える
0

この投稿はあなたの質問に答えます。

http://www.vancelucas.com/blog/get-only-public-class-properties-for-current-class-in-php/

get_object_vars()ただし、基本的には、が呼び出されるスコープのためにプロパティを取得します。ただし、投稿で概説されているようにスコープを変更すると、探している結果が得られるはずです。

public function toArray()
{
    $getFields = function($obj) { return get_object_vars($obj); };
    return $getFields($this);
}
于 2013-08-09T15:36:06.877 に答える
0

var_dump で答えが表示されます。"\0Test\0otherhidden"保護されたプロパティの配列キーはとに変わります "\0Test\0hidden"。print_r は、この事実を隠しています。

于 2013-08-09T15:42:00.003 に答える