静态变量必须是类定义的一部分,因此您无法动态地创建它们。即使使用反射也不行:
chuck at manchuck dot com 2 years ago
It is important to note that calling ReflectionClass::setStaticPropertyValue
will not allow you to add new static properties to a class.
但这看起来非常像一个
XY问题。你可能不想在运行时向PHP类添加静态属性;你有一些用例可以通过其他方式实现。或者,如果可用的话,那种方式将是实现某些用例的最快方式。也许还有其他方法。
实际上,下面的用例又是解决某个更高级别问题的可能解决方案。重新审视高级别问题并以不同的方式进行重构/重新思考可能是值得的,也许可以跳过完全干预静态属性的需要。
我想在我的类内部有一个属性字典。
trait HasDictionary {
private static $keyValueDictionary = [ ];
public static function propget($name) {
if (!array_key_exists($name, static::$keyValueDictionary) {
return null;
}
return static::$keyValueDictionary[$name];
}
public static function propset($name, $value) {
if (array_key_exists($name, static::$keyValueDictionary) {
$prev = static::$keyValueDictionary[$name];
} else {
$prev = null;
}
static::$keyValueDictionary[$name] = $value;
return $prev;
}
}
class MyClass
{
use Traits\HasDictionary;
...$a = self::propget('something');
self::propset('something', 'some value');
}
我想将一些值与类关联起来,或者说:我想在别人的类内部创建一个属性字典。
这实际上发生在我身上,我在研究如何实现它时发现了这个问题。在我的工作流程的B点,我需要知道给定类被定义在哪个地方(“A”),以及由代码的哪一部分定义。最终,我将这些信息存储到一个由我的自动加载程序提供数据的数组中,并且还能够在类第一次加载时存储debug_backtrace()
。
class ClassPropertySingletonMap {
use Traits\HasDictionary;
public static function setClassProp($className, $prop, $value) {
return self::propset("{$className}::{$prop}", $value);
}
public static function getClassProp($className, $prop) {
return self::propget("{$className}::{$prop}");
}
}
我想要修改一个类的已有属性,而不是创建一个新的属性。
function setPrivateStaticProperty($class, $property, $value) {
$reflector = new \ReflectionClass($class);
$reflector->getProperty($property)->setAccessible(true);
$reflector->setStaticPropertyValue($property, $value);
$reflector->getProperty($property)->setAccessible(false);
}