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,它仍然访问类的变量而不是对象变量。

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 回答
1
  1. 静态属性不是类常量

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

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

于 2013-11-05T12:00:28.703 回答