var_export()和静态类属性

时间:2013-11-05 11:42:24

标签: php

我玩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';

2 个答案:

答案 0 :(得分:1)

在编程和类static的上下文中,通常并不意味着它不会改变,这意味着它不依赖于类的实例。例如,在Java finally中意味着它不会改变

如果它们包含在班级的实例中,那就太奇怪了。

因此,即使PHP允许您使用$ inst :: $ v访问$ v,它仍然可以访问类的变量而不是对象变量。

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)));
}

答案 1 :(得分:1)

  1. static property不是class constant

      

    将类属性或方法声明为静态可使它们可访问   无需实例化类。声明为的财产   无法使用实例化的类对象访问static(尽管是   静态方法可以)。

  2. 由于var_export()旨在导出变量,因此只能导出类实例。因此,静态属性根本不属于那里。由于同样的原因,print_r()var_dump()或甚至serialize()都不会显示静态属性。

相关问题