0

var_export()をいじってみましたが、なぜ静的クラス プロパティが var_export() によってエクスポートされないのか疑問に思っています。

class TestStatic {
    public static $FOO_BAR = 'foobar';
}

$testStatic = new TestStatic();

var_export($testStatic);

結果は

TestStatic::__set_state(array(
))

静的プロパティが var_export() によってエクスポートされない理由はありますか?

私はそれがstatic意味することを知っていますit never changes。静的プロパティが var_dumo() によってエクスポートされないようにすることは理にかなっています。しかし、PHP では静的プロパティの値を後から変更することが可能であるため、静的プロパティの値は実行時に適切に変更される可能性があります。

$testStatic = new TestStatic();
$textStatic::$FOO_BAR = 'new value';
4

2 に答える 2

1

プログラミングとクラスのコンテキストでは、static通常、変更されないことを意味するのではなく、クラスのインスタンスに関連付けられていないことを意味します。たとえばJavaでは、finally変更されないことを意味します

それらがクラスのインスタンスに含まれているとしたら、それは奇妙なことです。

したがって、PHP で $inst::$v を使用して $v にアクセスできる場合でも、objects 変数ではなく、クラスの変数にアクセスします。

class A
{
    static $v;
}

A::$v = '1';
echo A::$v;        /* outputs '1' */

$inst = new A();
echo $inst::$v;    /* outputs '1' (this should never be the way to access static vars)*/
$inst::$v = '2';

echo $inst::$v;    /* outputs '2' (this should never be the way to access static vars)*/
echo A::$v;        /* outputs '2' */

本当に静的プロパティが必要な場合は、独自に記述します。

class A
{
    static $v = 'VV';
    public $b = 'BB';
}

function export_all($o)
{
    return array_merge(get_object_vars($o), get_class_vars(get_class($o)));
}

$c = new A();
var_dump(export_all($c));

outputs:
array(1) { ["b"]=> string(2) "BB" } array(2) { ["b"]=> string(2) "BB" ["v"]=> string(2) "VV" } 

クラス内から呼び出す必要があるプライベート変数も必要な場合は、次のようなものをクラスに追加する必要があります。

public function export_it() {
    return array_merge(get_object_vars($this), get_class_vars(get_class($this)));
}
于 2013-11-05T11:45:48.577 に答える