我玩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';
答案 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)
static property不是class constant:
将类属性或方法声明为静态可使它们可访问 无需实例化类。声明为的财产 无法使用实例化的类对象访问static(尽管是 静态方法可以)。
由于var_export()旨在导出变量,因此只能导出类实例。因此,静态属性根本不属于那里。由于同样的原因,print_r()
或var_dump()
或甚至serialize()
都不会显示静态属性。