繁体   English   中英

var_export()和静态类属性

[英]var_export() and static class properties

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

在编程和类的上下文中, 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. 静态属性不是类常量

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM