Is it possible to create static variables on runtime in PHP?
假设一个类foo有1个静态变量bar。是否可以在运行时编写一个php代码,用它为foo类创建一个新的静态变量bar2?
- 你能详细说明你为什么要这样做吗?
- 随机猜测:static Foo::bar2 = 'baz'?
- @泰勒:为了方便。如果可能的话,我可以动态地创建全局访问的对象。
- @约翰霍恩:我觉得你真的不想那样做(使用全局)。这几乎是一种反模式。弊大于利。
- @Johnjohn Netcoder是对的-你不应该需要。但是,请注意,您可以使用静态关联数组来代替它。
- @网络编码器:一般来说,我完全同意你的看法。但是我希望这是一个自制的框架,这样用户就可以在运行时修改核心类,并且在没有global $core;的情况下从任何地方访问它。在它的背景下,这将是伟大的。
- @赫米什:谢谢你的意见,我会试试的。
不,不可能。
正如其名称所说,静态变量是在编译时静态分配的。它不能在运行时分配,也不能在运行时释放(例如:unset)。
此外,静态变量独立于调用堆栈。
你可以在维基百科上阅读更多。
- -1在PHP中,静态变量的含义非常不同。
- @不,他们没有。静态局部变量是一回事。但是静态变量仍然是静态变量。
- 感谢您的意见!
- @Netcoder:我仍然认为你的说法不完全正确。PHP中的静态变量实际上与编译时分配的内存无关(如果解释的动态类型语言的上下文既不进行编译,也不能够提前真正分配数据结构(可能预先分配zval),那么这听起来就很奇怪了)。但我以+1的倒数淘汰了我的代码,指出我的代码是错误的。
- NICKIC:无论语言是解释的(PHP,Java,Python)还是不(C,汇编),编译器仍然涉及。编译实际上意味着"组合在一起"。
- @网络编码器:这是一个可以争论的术语。但是,即使您假设编译是在程序执行之前发生的任何事情,那么静态变量显然与您在维基百科上链接的内容无关。我实际上检查了PHP源代码,基本上创建静态变量和非静态变量的唯一区别就是它被放入了不同的哈希表中。初始化或分配值的方式完全没有区别(在这两种情况下,只分配zval)。
- @不管源代码怎么说,定义都是一样的:它不能在运行时被分配或释放。此外,您还可以自己使用术语"编译时"。;-)
- @Netcoder:值得一提的是,我自己也使用编译时,在我看来,在PHP中,静态变量只是一个类变量,与编译期间的分配行为无关。但实际上,在这里如何解释术语"static"并不重要,静态变量不能在运行时添加或删除的声明是正确的,这是问题上下文中的所有重要内容。你得到的是+1;)